一对多情况下读取父类的子集合时,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属性总结
网页URL:http://www.shufengxianlan.com/qtweb/news21/121071.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联