blog-moon

          導(dǎo)航

          <2025年8月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          統(tǒng)計(jì)

          常用鏈接

          留言簿(1)

          隨筆分類(lèi)

          隨筆檔案

          文章分類(lèi)

          文章檔案

          收藏夾

          Office

          Websphere

          數(shù)據(jù)庫(kù)

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          Hibernate之lazy屬性介紹

          本文主要針對(duì)一對(duì)多情況下讀取父類(lèi)的子集合時(shí),hibernate 的lazy屬性在其中的影響進(jìn)行總結(jié)。(以下代碼運(yùn)行在jdk1.5,jboss eclipse ide 1.5,hibernate 3.1環(huán)境下)
          假設(shè)有:父類(lèi) Person? (含有Set類(lèi)型屬性Address),
          ??????????????? 子類(lèi) Address(碰巧集合的名字和子類(lèi)的名字都是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 的周期內(nèi),無(wú)論lazy 設(shè)為true or false,?不會(huì)有任何限制。訪問(wèn)父子數(shù)據(jù)的代碼如下所示?:???????
          ??? ?//打開(kāi)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關(guān)閉
          ??? session.close();
          ?????if (session.isOpen()){
          ??????? ? HibernateUtil.closeSession();
          ??? }

          (2)在session的周期外,訪問(wèn)父子數(shù)據(jù)的代碼如下所示?:
          ???? //打開(kāi)session??
          ???? session = HibernateUtil.currentSession();

          ?????PersonDAO dao = new PersonDAO();
          ???? Person person = null;

          ???? person = (Person)dao.findByPrimaryKey(4);
          ?????/**********************
          ????? *留待后續(xù)處理
          ????? *********************/
          ???? session.close();
          ????
          ???? //session關(guān)閉之后才訪問(wèn)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();
          ??? }

          ?? 此時(shí),上述代碼的運(yùn)行結(jié)果根據(jù)lazy的設(shè)置的不同而不同
          lazy=false
          ???結(jié)果:可以訪問(wèn)得到Person和Address的數(shù)據(jù)
          lazy= true
          ??? 根據(jù)代碼的寫(xiě)法有不同
          ??? (1)代碼其他處不做任何處理,則拋出異常
          ???????? org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role:?
          ???????? 。。。。。。
          ??? (2)如果做一些處理如下,將上述那段代碼中的"留待后續(xù)處理"換成以下代碼
          ?????????? Hibernate.initialize(person.getAddress());? 則可以訪問(wèn)得到Person和Address的數(shù)據(jù)
          ???????? 實(shí)際編寫(xiě)時(shí),不會(huì)象上述這樣的寫(xiě)法,即將
          ???????? Hibernate.initialize(person.getAddress());和person.getAddress()在同一個(gè)方法里面調(diào)用。他們往往出現(xiàn)在應(yīng)用程序的不同層次中(前者出現(xiàn)在DAO層居多,而后者則出現(xiàn)在web層居多).

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


          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 广汉市| 武胜县| 甘德县| 龙陵县| 南雄市| 淮阳县| 肃北| 胶南市| 瑞丽市| 盖州市| 泉州市| 肇东市| 丹阳市| 孙吴县| 溧水县| 界首市| 松原市| 上虞市| 昌平区| 顺义区| 玉溪市| 余庆县| 婺源县| 巴林左旗| 乌鲁木齐市| 玉门市| 徐闻县| 肥乡县| 延庆县| 平舆县| 精河县| 拉孜县| 葫芦岛市| 河间市| 荔波县| 喀什市| 德安县| 海南省| 赤水市| 东光县| 壶关县|