Hibernate的lazy属性总结

一对多情况下读取父类的子集合时,hibernate的lazy属性在其中的影响进行总结。(以下代码运行在jdk1.5,jboss eclipse ide 1.5,hibernate 3.1环境下)

网站建设哪家好,找创新互联建站!专注于网页设计、网站建设、微信开发、成都微信小程序、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了尤溪免费建站欢迎大家使用!

假设有:父类 Person   (含有Set类型属性Address),子类 Address(碰巧集合的名字和子类的名字都是Address,不要混淆了)Person.hbm.xml   主要片段:

 
 
 
  1. < id name="idx"  column="idx"  type="long">
  2.  < generator class="identity"/>
  3. < /id>
  4. < property  name="age"  type="int" update="true" insert="true"column="age"/>
  5. < property  name="name"  type="java.lang.String" update="true"insert="true"
  6. column="name"/>
  7. < set name="address" table="address"  lazy="true"  cascade="none"  sort="unsorted">
  8. < key >
  9. < column name="personidx"/>
  10. < /key>
  11. < one-to-many class="com.abc.common.pojo.Address"/>
  12. < /set>

在session 的周期内,无论hibernate的lazy属性设为true or false, 不会有任何限制。访问父子数据的代码如下所示 :

 
 
 
  1.   //打开session  
  2.   session = HibernateUtil.currentSession();
  3.   PersonDAO dao = new PersonDAO();
  4.   Person person = null;
  5.   person = (Person)dao.findByPrimaryKey(4);
  6.   Set addressSet = person.getAddress();
  7.  Address[] addressAry = new Address[addressSet.size()];
  8.  Address address = null ;
  9.  addressSet.toArray(addressAry);
  10.  for(int i=0 ;i< addressAry.length;i++){
  11.                  ................      
  12.   }
  13. //session关闭
  14.  session.close();
  15.   if (session.isOpen()){
  16.        HibernateUtil.closeSession();
  17.  }

(2)在session的周期外,访问父子数据的代码如下所示 :

 
 
 
  1.  //打开session  
  2.  session = HibernateUtil.currentSession();
  3.  PersonDAO dao = new PersonDAO();
  4.  Person person = null;
  5.  person = (Person)dao.findByPrimaryKey(4);
  6.  session.close();
  7.  //session关闭之后才访问person的子集
  8.  Set addressSet = person.getAddress();
  9. Address[] addressAry = new Address[addressSet.size()];
  10. Address address = null ;
  11. addressSet.toArray(addressAry);
  12. for(int i=0 ;i< addressAry.length;i++){
  13.                 ................      
  14.  }
  15.  if (session.isOpen()){
  16.       HibernateUtil.closeSession();
  17. }

此时,上述代码的运行结果根据hibernate的lazy属性的设置的不同而不同

lazy=false

结果:可以访问得到Person和Address的数据

lazy= true

根据代码的写法有不同

 (1)代码其他处不做任何处理,则抛出异常

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role:

 (2)如果做一些处理如下,将上述那段代码中的"留待后续处理"换成以下代码

Hibernate.initialize(person.getAddress());   则可以访问得到Person和Address的数据

实际编写时,不会象上述这样的写法,即将

Hibernate.initialize(person.getAddress());和person.getAddress()在同一个方法里面调用。他们往往出现在应用程序的不同层次中(前者出现在DAO层居多,而后者则出现在web层居多).

分享标题:Hibernate的lazy属性总结
网页URL:http://www.shufengxianlan.com/qtweb/news21/121071.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联