blog-moon

          導航

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          統計

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          Office

          Websphere

          數據庫

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          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">
          ??????????? </generator>
          ??????? </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>
          ????(1)在session 的周期內,無論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();
          ??? }

          ?? 此時,上述代碼的運行結果根據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層居多).

          posted on 2006-02-03 23:04 moon 閱讀(1635) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 巴南区| 桃江县| 定陶县| 崇信县| 麻栗坡县| 万安县| 仁怀市| 吴旗县| 手游| 阳泉市| 芦溪县| 九台市| 宿松县| 葫芦岛市| 济阳县| 姜堰市| 高雄市| 太湖县| 文成县| 宽城| 九龙坡区| 淮滨县| 石楼县| 陇南市| 阿坝县| 嵊泗县| 富平县| 潜山县| 瓮安县| 伊金霍洛旗| 正定县| 罗田县| 本溪| 根河市| 瑞昌市| 江陵县| 上思县| 大关县| 平乡县| 汾西县| 扎鲁特旗|