日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網營銷解決方案
Hibernate的lazy屬性總結

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

網站建設哪家好,找創(chuàng)新互聯(lián)建站!專注于網頁設計、網站建設、微信開發(fā)、成都微信小程序、集團企業(yè)網站建設等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了尤溪免費建站歡迎大家使用!

假設有:父類 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, 不會有任何限制。訪問父子數(shù)據(jù)的代碼如下所示 :

 
 
 
  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的周期外,訪問父子數(shù)據(jù)的代碼如下所示 :

 
 
 
  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. }

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

lazy=false

結果:可以訪問得到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()在同一個方法里面調用。他們往往出現(xiàn)在應用程序的不同層次中(前者出現(xiàn)在DAO層居多,而后者則出現(xiàn)在web層居多).


網頁標題:Hibernate的lazy屬性總結
本文路徑:http://www.dlmjj.cn/article/cdpcjdo.html