Hibernate的lazy属性总结

开发 后端
本文对Hibernate的lazy属性做了一些总结。在session 的周期内,无论hibernate的lazy属性设为true or false, 不会有任何限制。

一对多情况下读取父类的子集合时,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.  
  3.  < generator class="identity"/> 
  4. < /id> 
  5.  
  6. < property  name="age"  type="int" update="true" insert="true"column="age"/> 
  7. < property  name="name"  type="java.lang.String" update="true"insert="true"  
  8. column="name"/> 
  9.  
  10. < set name="address" table="address"  lazy="true"  cascade="none"  sort="unsorted"> 
  11. < key > 
  12. < column name="personidx"/> 
  13. < /key> 
  14. < one-to-many class="com.abc.common.pojo.Address"/> 
  15.  
  16. < /set> 

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

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

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

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

此时,上述代码的运行结果根据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层居多).

【编辑推荐】

  1. Hibernate中hbm的generator子元素
  2. 简单理解Hibernate三种状态的概念及互相转化
  3. 操作Hibernate类:增加,删除,修改及查询
  4. 对于选择Hibernate还是iBatis的看法
  5. Hibernate缓存分类,范围及管理配置
责任编辑:book05 来源: 百度博客
相关推荐

2009-06-18 11:25:26

Hibernate L

2009-07-02 09:38:17

Hibernate延时

2009-06-24 07:59:49

Hibernate方言

2009-06-29 08:58:06

Hibernate的g

2009-06-29 08:59:05

hbm的generat

2009-09-29 17:00:08

Hibernate c

2009-09-23 13:33:51

Hibernate属性

2012-02-03 10:21:47

HibernateJava

2009-09-29 16:25:29

Hibernate c

2009-09-25 13:39:40

Hibernate属性

2009-09-28 09:56:53

Hibernate属性

2009-09-29 16:32:11

OJB Hiberna

2009-09-25 17:26:55

使用Hibernate

2009-09-27 14:53:38

Hibernate S

2011-04-07 11:06:18

Hibernate

2023-09-14 08:16:50

Lazy注解null

2009-09-25 16:55:08

Hibernate初始

2009-09-23 17:52:16

Hibernate概念Hibernate常见

2010-02-26 15:22:55

.NET Framew

2022-10-18 07:10:09

Python应用程序模块
点赞
收藏

51CTO技术栈公众号