Session中l(wèi)oad/get方法的詳細(xì)區(qū)別

Session.load/get方法均可以根據(jù)指定的實(shí)體類和id從數(shù)據(jù)庫讀取記錄,并返回與之對(duì)應(yīng)的實(shí)體對(duì)象赎线。

其區(qū)別在于:

如果未能發(fā)現(xiàn)符合條件的記錄痛侍,get方法返回null,而load方法會(huì)拋出一個(gè)ObjectNotFoundException宪彩。

Load方法可返回實(shí)體的代理類實(shí)例休讳,而get方法永遠(yuǎn)直接返回實(shí)體類。

load方法可以充分利用內(nèi)部緩存和二級(jí)緩存中的現(xiàn)有數(shù)據(jù)尿孔,而get方法則僅僅在內(nèi)部緩存中進(jìn)行數(shù)據(jù)查找俊柔,如沒有發(fā)現(xiàn)對(duì)應(yīng)數(shù)據(jù),將越過二級(jí)緩存活合,直接調(diào)用SQL完成數(shù)據(jù)讀取雏婶。

Session在加載實(shí)體對(duì)象時(shí),將經(jīng)過的過程:

首先白指,Hibernate中維持了兩級(jí)緩存留晚。第一級(jí)緩存由Session實(shí)例維護(hù),其中保持了Session當(dāng)前所有關(guān)聯(lián)實(shí)體的數(shù)據(jù)告嘲,也稱為內(nèi)部緩存倔丈。而第二級(jí)緩存則存在于SessionFactory層次,由當(dāng)前所有由本SessionFactory構(gòu)造的Session實(shí)例共享状蜗。出于性能考慮需五,避免無謂的數(shù)據(jù)庫訪問,Session在調(diào)用數(shù)據(jù)庫查詢功能之前轧坎,會(huì)先在緩存中進(jìn)行查詢宏邮。首先在第一級(jí)緩存中,通過實(shí)體類型和id進(jìn)行查找,如果第一級(jí)緩存查找命中蜜氨,且數(shù)據(jù)狀態(tài)合法械筛,則直接返回。

之后飒炎,Session會(huì)在當(dāng)前“NonExists(把無效的條件寫成一個(gè)黑名單埋哟,既然無效,那么也沒必要再查下去)”記錄中進(jìn)行查找郎汪,如果“NonExists”記錄中存在同樣的查詢條件赤赊,則返回null∩酚“NonExists”記錄了當(dāng)前Session實(shí)例在之前所有查詢操作中抛计,未能查詢到有效數(shù)據(jù)的查詢條件(相當(dāng)于一個(gè)查詢黑名單列表)。如此一來照筑,如果Session中一個(gè)無效的查詢條件重復(fù)出現(xiàn)吹截,即可迅速作出判斷,從而獲得最佳的性能表現(xiàn)凝危。

對(duì)于load方法而言波俄,如果內(nèi)部緩存中未發(fā)現(xiàn)有效數(shù)據(jù),則查詢第二級(jí)緩存蛾默,如果第二級(jí)緩存命中弟断,則返回。

如在緩存中未發(fā)現(xiàn)有效數(shù)據(jù)趴生,則發(fā)起數(shù)據(jù)庫查詢操作(Select SQL)阀趴,如經(jīng)過查詢未發(fā)現(xiàn)對(duì)應(yīng)記錄,則將此次查詢的信息在“NonExists”中加以記錄苍匆,并返回null刘急。

根據(jù)映射配置和Select SQL得到的ResultSet,創(chuàng)建對(duì)應(yīng)的數(shù)據(jù)對(duì)象浸踩。

將其數(shù)據(jù)對(duì)象納入當(dāng)前Session實(shí)體管理容器(一級(jí)緩存)叔汁。

執(zhí)行Interceptor.onLoad方法(如果有對(duì)應(yīng)的Interceptor)。

將數(shù)據(jù)對(duì)象納入二級(jí)緩存检碗。

如果數(shù)據(jù)對(duì)象實(shí)現(xiàn)了LifeCycle接口据块,則調(diào)用數(shù)據(jù)對(duì)象的onLoad方法。

返回?cái)?shù)據(jù)對(duì)象折剃。

/** *//**

* load()方法的執(zhí)行順序如下:

* a):首先通過id在session緩存中查找對(duì)象另假,如果存在此id的對(duì)象,直接將其返回

* b):在二級(jí)緩存中查找怕犁,找到后將 其返回边篮。

* c):如果在session緩存和二級(jí)緩存中都找不到此對(duì)象己莺,則從數(shù)據(jù)庫中加載有此ID的對(duì)象

* 因此load()方法并不總是導(dǎo)致SQL語句,只有緩存中無此數(shù)據(jù)時(shí)戈轿,才向數(shù)據(jù)庫發(fā)送SQL凌受!

*/

/** *//**

* 與get()的區(qū)別:

* 1:在立即加載對(duì)象(當(dāng)hibernate在從數(shù)據(jù)庫中取得數(shù)據(jù)組裝好一個(gè)對(duì)象后

* 會(huì)立即再從數(shù)據(jù)庫取得數(shù)據(jù)此對(duì)象所關(guān)聯(lián)的對(duì)象)時(shí),如果對(duì)象存在思杯,

* load()和get()方法沒有區(qū)別胜蛉,都可以取得已初始化的對(duì)象;但如果當(dāng)對(duì)

* 象不存在且是立即加載時(shí),使用get()方法則返回null,而使用load()則

* 拋出一個(gè)異常色乾。因此使用load()方法時(shí)誊册,要確認(rèn)查詢的主鍵ID一定是存在

* 的,從這一點(diǎn)講它沒有g(shù)et方便杈湾!

* 2:在延遲加載對(duì)象(Hibernate從數(shù)據(jù)庫中取得數(shù)據(jù)組裝好一個(gè)對(duì)象后,

* 不會(huì)立即再從數(shù)據(jù)庫取得數(shù)據(jù)組裝此對(duì)象所關(guān)聯(lián)的對(duì)象攘须,而是等到需要時(shí)漆撞,

* 都會(huì)從數(shù)據(jù)庫取得數(shù)據(jù)組裝此對(duì)象關(guān)聯(lián)的對(duì)象)時(shí),get()方法仍然使用

* 立即加載的方式發(fā)送SQL語句于宙,并得到已初始化的對(duì)象浮驳,而load()方法則

* 根本不發(fā)送SQL語句,它返回一個(gè)代理對(duì)象捞魁,直到這個(gè)對(duì)象被訪問時(shí)才被

* 初始化至会。

*/

get()----不支持LAZY

load()----支持LAZY

load和get一共是2個(gè)區(qū)別 先講第一個(gè) 延遲加載

load是true而get是false

意 思就是 load采用的是延遲加載的方式 而get不是,hibernate思想是 既然這個(gè)方法支持延遲加載 他就認(rèn)為這個(gè)對(duì)象一定在數(shù)據(jù)庫存在谱俭,在你 聲明 TFaq tfag2=(TFaq)sess.load(TFaq.class, 300); 這句時(shí)候奉件,hibernate就干了一件事

1.查詢session緩存

2.緩存中沒有這個(gè)對(duì)象 就創(chuàng)建個(gè)代理

因?yàn)檠舆t加載需要代理來執(zhí)行 所以就創(chuàng)建了個(gè)代理

ok 到此為止 這句話就干了個(gè)這個(gè) 并沒有去數(shù)據(jù)庫交互查詢

當(dāng)你使用這個(gè)對(duì)象 比如tfag2.getTfRtitle()或get方法時(shí)候

這個(gè)時(shí)候 hibernate就去查詢二級(jí)緩存和數(shù)據(jù)庫,數(shù)據(jù)庫沒有這條數(shù)據(jù) 就拋出異常

整個(gè)load方法調(diào)用結(jié)束 load沒什么神奇 這就是他干過所有的事情

load方法講完了 我在講一下get方法工作原理

因?yàn)閔ibernate規(guī)定get方法不能使用延遲加載 所以和load還是不一樣的

TFaq tfag2=(TFaq)sess.get(TFaq.class, 300);

在創(chuàng)建這條語句時(shí)候 我們看看hibernate干了哪些事

1.get方法首先查詢session緩存 (session緩存就是hibernate的一級(jí)緩存 這個(gè)概念大家應(yīng)該清楚吧 )

2.get方法如果在session緩存中找到了該id對(duì)應(yīng)的對(duì)象昆著,如果剛好該對(duì)象前面是被代理過的县貌,如被load方法使用過,或者被其他關(guān)聯(lián)對(duì)象延遲加載過凑懂,那么返回的還是原先的代理對(duì)象煤痕,而不是實(shí)體類對(duì)象。

3.如果該代理對(duì)象還沒有加載實(shí)體數(shù)據(jù)(就是id以外的其他屬性數(shù)據(jù))接谨,那么它會(huì)查詢二級(jí)緩存或者數(shù)據(jù)庫來加載數(shù)據(jù)摆碉,但是返回的還是代理對(duì)象,只不過已經(jīng)加載了實(shí)體數(shù)據(jù)脓豪。

(這個(gè)代理實(shí)際就是空的對(duì)象 并沒有去數(shù)據(jù)庫查詢得到的 我們叫代理對(duì)象巷帝,如果 去數(shù)據(jù)庫查詢了 返回到了這個(gè)對(duì)象 我們叫實(shí)體對(duì)象 就是這個(gè)對(duì)象真實(shí)存在)

我在總結(jié)性一句話這2者區(qū)別

get方法首先查詢session緩存,沒有的話查詢二級(jí)緩存扫夜,最后查詢數(shù)據(jù)庫锅睛;反而load方法創(chuàng)建時(shí)首先查詢session緩存埠巨,沒有就創(chuàng)建代理,實(shí)際使用數(shù)據(jù)時(shí)才查詢二級(jí)緩存和數(shù)據(jù)庫

----我測(cè)試過:

在使用session.get方法后如果把session關(guān)閉的話现拒,也會(huì)出現(xiàn)懶加載異常辣垒。

那么只有在manytoone標(biāo)簽里配置 lazy="false"時(shí)異常才會(huì)解決。

也就是說上面轉(zhuǎn)載的第3條不是那么正確:返回該代理對(duì)象不錯(cuò)印蔬,但是如果該對(duì)象沒有加載實(shí)體數(shù)據(jù)勋桶,那么也會(huì)在用到時(shí)才會(huì)加載,即不會(huì)立即查詢數(shù)據(jù)庫或者二級(jí)緩存侥猬,那么你現(xiàn)在把session關(guān)閉例驹,這個(gè)對(duì)行啊沒有加載實(shí)體數(shù)據(jù)----才會(huì)出現(xiàn)懶加載異常。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末退唠,一起剝皮案震驚了整個(gè)濱河市鹃锈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瞧预,老刑警劉巖屎债,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異垢油,居然都是意外死亡盆驹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門滩愁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躯喇,“玉大人,你說我怎么就攤上這事硝枉×觯” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵妻味,是天一觀的道長(zhǎng)雅倒。 經(jīng)常有香客問我,道長(zhǎng)弧可,這世上最難降的妖魔是什么蔑匣? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮棕诵,結(jié)果婚禮上裁良,老公的妹妹穿的比我還像新娘。我一直安慰自己校套,他們只是感情好价脾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著笛匙,像睡著了一般侨把。 火紅的嫁衣襯著肌膚如雪犀变。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天秋柄,我揣著相機(jī)與錄音获枝,去河邊找鬼。 笑死骇笔,一個(gè)胖子當(dāng)著我的面吹牛省店,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播笨触,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼懦傍,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了芦劣?” 一聲冷哼從身側(cè)響起粗俱,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎虚吟,沒想到半個(gè)月后寸认,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡稍味,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年废麻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了荠卷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片模庐。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖油宜,靈堂內(nèi)的尸體忽然破棺而出掂碱,到底是詐尸還是另有隱情,我是刑警寧澤慎冤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布疼燥,位于F島的核電站,受9級(jí)特大地震影響蚁堤,放射性物質(zhì)發(fā)生泄漏醉者。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一披诗、第九天 我趴在偏房一處隱蔽的房頂上張望撬即。 院中可真熱鬧,春花似錦呈队、人聲如沸剥槐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粒竖。三九已至颅崩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蕊苗,已是汗流浹背沿后。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岁歉,地道東北人得运。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像锅移,于是被迫代替她去往敵國和親熔掺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容