自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Hibernate的lazy屬性總結(jié)

開發(fā) 后端
本文對Hibernate的lazy屬性做了一些總結(jié)。在session 的周期內(nèi),無論hibernate的lazy屬性設(shè)為true or false, 不會有任何限制。

一對多情況下讀取父類的子集合時,hibernate的lazy屬性在其中的影響進(jìn)行總結(jié)。(以下代碼運行在jdk1.5,jboss eclipse ide 1.5,hibernate 3.1環(huán)境下)

假設(shè)有:父類 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 的周期內(nèi),無論hibernate的lazy屬性設(shè)為true or false, 不會有任何限制。訪問父子數(shù)據(jù)的代碼如下所示 :      

  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關(guān)閉  
  18.  session.close();  
  19.   if (session.isOpen()){  
  20.        HibernateUtil.closeSession();  
  21.  }  

(2)在session的周期外,訪問父子數(shù)據(jù)的代碼如下所示 :

  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關(guān)閉之后才訪問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. }  

此時,上述代碼的運行結(jié)果根據(jù)hibernate的lazy屬性的設(shè)置的不同而不同

lazy=false

結(jié)果:可以訪問得到Person和Address的數(shù)據(jù)

lazy= true

根據(jù)代碼的寫法有不同

 (1)代碼其他處不做任何處理,則拋出異常

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

 (2)如果做一些處理如下,將上述那段代碼中的"留待后續(xù)處理"換成以下代碼

Hibernate.initialize(person.getAddress());   則可以訪問得到Person和Address的數(shù)據(jù)

實際編寫時,不會象上述這樣的寫法,即將

Hibernate.initialize(person.getAddress());和person.getAddress()在同一個方法里面調(diào)用。他們往往出現(xiàn)在應(yīng)用程序的不同層次中(前者出現(xiàn)在DAO層居多,而后者則出現(xiàn)在web層居多).

【編輯推薦】

  1. Hibernate中hbm的generator子元素
  2. 簡單理解Hibernate三種狀態(tài)的概念及互相轉(zhuǎn)化
  3. 操作Hibernate類:增加,刪除,修改及查詢
  4. 對于選擇Hibernate還是iBatis的看法
  5. Hibernate緩存分類,范圍及管理配置
責(zé)任編輯:book05 來源: 百度博客
相關(guān)推薦

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-23 13:33:51

Hibernate屬性

2009-09-29 17:00:08

Hibernate c

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-27 14:53:38

Hibernate S

2009-09-25 17:26:55

使用Hibernate

2011-04-07 11:06:18

Hibernate

2009-09-25 16:55:08

Hibernate初始

2009-09-23 17:52:16

Hibernate概念Hibernate常見

2023-09-14 08:16:50

Lazy注解null

2009-06-18 11:43:40

Hibernate uHibernate s

2010-02-26 15:22:55

.NET Framew
點贊
收藏

51CTO技術(shù)棧公眾號