眾所周知,到了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ì)象一起查詢出來,這樣造成了極大的性能浪費(fèi).在不指定lazy屬性時(shí),<many-to-one>所關(guān)聯(lián)的對(duì)象反而會(huì)延遲加載,這讓我大為困惑,還以為是Hibernate的bug.
在網(wǎng)上查找資料,說在為了延遲加載<one-to-one>,<many-to-one>所關(guān)聯(lián)的對(duì)象,需要設(shè)置被關(guān)聯(lián)的對(duì)象<class name="" lazy="true">,我也這樣做了,但是仍然沒有效果.
仔細(xì)閱讀了Hibernate的手冊(cè),才發(fā)現(xiàn)原來要延遲加載<one-to-one>,<many-to-one>所關(guān)聯(lián)的對(duì)象時(shí),除了要指定lazy="true"外,還需要運(yùn)行期字節(jié)碼增強(qiáng),而我省去了這一步,所以延遲加載沒有效果.同時(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)過運(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í),它通過<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í)體查詢出來了,因此在<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)過運(yùn)行期字節(jié)碼增加,延遲加載才會(huì)奏效.
Open Session In View
使用Open Session In View就有一個(gè)好處,就是當(dāng)頁面需要使用關(guān)聯(lián)后的實(shí)體時(shí)才會(huì)去查找緩存中是否已經(jīng)有所需要的對(duì)象實(shí)體了,如果有直接返回結(jié)果,如果沒有才重新查詢。
cache
cache就是Hibernate使用的緩存。如果你的數(shù)據(jù)是頻繁更新的,比如銀行系統(tǒng),那么,你的數(shù)據(jù)做cache是不安全的,那么你的取數(shù)據(jù)的策略需要級(jí)別高一些,甚至是需要事務(wù)級(jí)的取緩存數(shù)據(jù);如果你的數(shù)據(jù)是頻繁讀取,修改少的,我可以放心的緩存,不必設(shè)置過高的緩存并發(fā)控制級(jí)別,比如是論壇系統(tǒng),那么你說的問題幾乎不可能出現(xiàn)啊。
兩面性是有,但是我們根據(jù)場合,在合適的場合使用合適的一面,那就不ok了?我得問題討論的前提是使用cache沒有并發(fā)更新之類問題的前提下的,是指在使用cache時(shí)不需要考慮另一面性的前提下,這種情況下談何兩面性。
什么樣的數(shù)據(jù)適合存放到第二級(jí)緩存中?
1、很少被修改的數(shù)據(jù)
2、不是很重要的數(shù)據(jù),允許出現(xiàn)偶爾并發(fā)的數(shù)據(jù)
3、不會(huì)被并發(fā)訪問的數(shù)據(jù)
4、參考數(shù)據(jù)
不適合存放到第二級(jí)緩存的數(shù)據(jù)?
1、經(jīng)常被修改的數(shù)據(jù)
2、財(cái)務(wù)數(shù)據(jù),絕對(duì)不允許出現(xiàn)并發(fā)
3、與其他應(yīng)用共享的數(shù)據(jù)。