hibernate中的延迟加载(load()方法)

1,    当设置延迟策略lazy=“true”,session加载得到对象obj,随即session关闭,不能对实体进行操作,否则会发生初始化代理异常等错误。

 例如:User user=session.load(User.Class,1);

            session.close();

            user.getName();(或者user.setName(String name))

此时会报错

     1,ERROR LazyInitializer:63 - Exception initializing proxy   

     2,net.sf.hibernate.HibernateException: Couldnotinitializeproxy-theowningSessionwasclosed  

     (1)这是因为load方法得到的是User的一个代理实例,session并没有执行selec语句,所以这个代理实例的属性值并没有填充(仅id填充),即没有初始化该代理实例。

     (2)当session关闭后,调用user.getName()方法,试图去执行select语句,而此时因为session已经关闭,不能够执行select语句来填充即初始化该代理实例,必然报错!

              以下是正确的:

           User user=session.load(User.Class,1);

            session.close();

            user.getId();这是因为id一直都是填充的,运行getId方法时不需要执行select语句填充代理。

      

 注意:经过测试,user.setName(String name),System.out.println(manureInfo);在session关闭后,也不能正常执行,我的理解是:setName需要执行update操作,而此时session关闭,所以会发生异常!而打印manureInfo时,也需要对它初始化填充属性值,需要执行select操作,而此时的session关闭,则异常!

知道更多细节内容,参看http://developer.51cto.com/art/200907/133249.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值