鷹翔宇空

          學(xué)習(xí)和生活

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            110 Posts :: 141 Stories :: 315 Comments :: 1 Trackbacks
          原文引自:http://forum.javaeye.com/viewtopic.php?t=18128

          眾所周知,到了Hibernate3.0以后,關(guān)聯(lián)關(guān)系的對(duì)象默認(rèn)都是使用延遲加載,例如<one-to-many>時(shí).但我在映射<one-to-one>,<many-to-one>關(guān)系時(shí)指定了lazy="true",但是在查詢對(duì)象時(shí),我只想查詢一個(gè)對(duì)象,仍然會(huì)把這個(gè)對(duì)象所關(guān)聯(lián)的<one-to-one>,<many-to-one>對(duì)象一起查詢出來(lái),這樣造成了極大的性能浪費(fèi).在不指定lazy屬性時(shí),<many-to-one>所關(guān)聯(lián)的對(duì)象反而會(huì)延遲加載,這讓我大為困惑,還以為是Hibernate的bug.
          在網(wǎng)上查找資料,說(shuō)在為了延遲加載<one-to-one>,<many-to-one>所關(guān)聯(lián)的對(duì)象,需要設(shè)置被關(guān)聯(lián)的對(duì)象<class name="" lazy="true">,我也這樣做了,但是仍然沒(méi)有效果.
          仔細(xì)閱讀了Hibernate的手冊(cè),才發(fā)現(xiàn)原來(lái)要延遲加載<one-to-one>,<many-to-one>所關(guān)聯(lián)的對(duì)象時(shí),除了要指定lazy="true"外,還需要運(yùn)行期字節(jié)碼增強(qiáng),而我省去了這一步,所以延遲加載沒(méi)有效果.同時(shí)還發(fā)現(xiàn)在默認(rèn)情況下,<one-to-one>,<many-to-one>的lazy屬性是"proxy"而不是"true"!因此如果直接采用lazy的默認(rèn)值,是可以延遲加載的.
          總結(jié)一下:
          <many-to-one>默認(rèn)的屬性是lazy="proxy",此時(shí)默認(rèn)是會(huì)延遲加載的.在指定了lazy="true"之后,必須要經(jīng)過(guò)運(yùn)行期字節(jié)碼增加,延遲加載才有效果.
          而<one-to-one>相對(duì)要復(fù)雜一點(diǎn),延遲加載還要受到constrained屬性的限制.constrained="false"時(shí)表明實(shí)體和被關(guān)聯(lián)到的實(shí)體的約束不是強(qiáng)制的,即存在一個(gè)實(shí)體時(shí),它通過(guò)<one-to-one>關(guān)聯(lián)的實(shí)體可能存在,也可能不存在,這時(shí)在查詢實(shí)體時(shí),Hibernate總會(huì)發(fā)起一次查詢檢查<one-to-one>所關(guān)聯(lián)的實(shí)體是否存在,而這時(shí)已經(jīng)可以把one-to-one關(guān)聯(lián)的實(shí)體查詢出來(lái)了,因此在<one-to-one>關(guān)系中,如果constrained="false",總是會(huì)立即加載關(guān)聯(lián)到的實(shí)體.
          如果當(dāng)constrained="true",且lazy="proxy"(默認(rèn)),是可以延遲加載的.
          如果當(dāng)constrained="true",且lazy="true"時(shí),需要經(jīng)過(guò)運(yùn)行期字節(jié)碼增加,延遲加載才會(huì)奏效.

          但是這里我還是有個(gè)疑問(wèn),既然在lazy="proxy"時(shí),已經(jīng)實(shí)現(xiàn)了延遲加載的效果,為什么在lazy="true"時(shí),還需要?jiǎng)討B(tài)字節(jié)碼增強(qiáng)才能實(shí)現(xiàn)延遲加載呢?


          Re: Hibernate中的延遲加載


          以后在one-to-one或many-to-one中不會(huì)再有l(wèi)azy="true"了,你可以理解成no-proxy.

          [1]起碼還是好的方向: 默認(rèn)就可以lazy了. 而且來(lái)了extra :)
          [2]寫(xiě)Hibernate的哥們也是要活命的嘛, 不改變?cè)趺磥?lái)的咨詢費(fèi), 不過(guò)Hibernate的migration寫(xiě)的也還不錯(cuò).
          [3]constrained如你所說(shuō), 而且我估計(jì)這個(gè)屬性以后不會(huì)有太大變更.

          hope that helps :)
          regards
          posted on 2006-02-10 09:47 TrampEagle 閱讀(2873) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): hibernate

          Feedback

          # re: Hibernate中的延遲加載 2008-11-18 11:07 ccc
          cccc  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 商都县| 徐水县| 云安县| 策勒县| 琼海市| 朔州市| 广德县| 永兴县| 高邮市| 临清市| 长宁区| 佛教| 凤山市| 成都市| 顺昌县| 门源| 娄底市| 沧源| 华容县| 印江| 延津县| 金川县| 彭阳县| 建宁县| 长治县| 海门市| 尼玛县| 墨江| 张家港市| 兴仁县| 中超| 新绛县| 大港区| 沧州市| 沁源县| 东乌| 桃江县| 浏阳市| 包头市| 营口市| 南涧|