千家信息网

Hibernate中的lazy属性总结

发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,这篇文章主要介绍"Hibernate中的lazy属性总结",在日常操作中,相信很多人在Hibernate中的lazy属性总结问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答
千家信息网最后更新 2024年11月23日Hibernate中的lazy属性总结

这篇文章主要介绍"Hibernate中的lazy属性总结",在日常操作中,相信很多人在Hibernate中的lazy属性总结问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Hibernate中的lazy属性总结"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

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

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

< id name="idx"  column="idx"  type="long">   < generator class="identity"/> < /id>  < property  name="age"  type="int" update="true" insert="true"column="age"/> < property  name="name"  type="java.lang.String" update="true"insert="true"  column="name"/>  < set name="address" table="address"  lazy="true"  cascade="none"  sort="unsorted"> < key > < column name="personidx"/> < /key> < one-to-many class="com.abc.common.pojo.Address"/>  < /set>

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

  //打开session      session = HibernateUtil.currentSession();     PersonDAO dao = new PersonDAO();    Person person = null;     person = (Person)dao.findByPrimaryKey(4);    Set addressSet = person.getAddress();    Address[] addressAry = new Address[addressSet.size()];   Address address = null ;   addressSet.toArray(addressAry);    for(int i=0 ;i< addressAry.length;i++){                   ................          }  //session关闭   session.close();    if (session.isOpen()){         HibernateUtil.closeSession();   }

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

 //打开session     session = HibernateUtil.currentSession();    PersonDAO dao = new PersonDAO();   Person person = null;    person = (Person)dao.findByPrimaryKey(4);    session.close();    //session关闭之后才访问person的子集   Set addressSet = person.getAddress();   Address[] addressAry = new Address[addressSet.size()];  Address address = null ;  addressSet.toArray(addressAry);   for(int i=0 ;i< addressAry.length;i++){                  ................         }   if (session.isOpen()){        HibernateUtil.closeSession();  }

此时,上述代码的运行结果根据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属性总结"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

0