溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Hibernate中的lazy屬性總結

發布時間:2021-09-17 09:46:26 來源:億速云 閱讀:125 作者:chen 欄目:編程語言

這篇文章主要介紹“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屬性總結”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女