load和get一共是2個區別 先講第一個 消極式載入
load是true而get是false
意 思就是 load採用的是消極式載入的方式 而get不是,hibernate思想是 既然這個方法支援消極式載入 他就認為這個對象一定在資料庫存在,在你 聲明 TFaq tfag2=(TFaq)sess.load(TFaq.class, 300); 這句時候,hibernate就幹了一件事
1.查詢session緩衝
2.緩衝中沒有這個對象 就建立個代理
因為消極式載入需要代理來執行 所以就建立了個代理
ok 到此為止 這句話就幹了個這個 並沒有去資料庫互動查詢
當你使用這個對象 比如tfag2.getTfRtitle()或get方法時候
這個時候 hibernate就去查詢二級緩衝和資料庫,資料庫沒有這條資料 就拋出異常
整個load方法調用結束 load沒什麼神奇 這就是他幹過所有的事情
load方法講完了 我在講一下get方法工作原理
因為hibernate規定get方法不能使用消極式載入 所以和load還是不一樣的
TFaq tfag2=(TFaq)sess.get(TFaq.class, 300);
在建立這條語句時候 我們看看hibernate幹了哪些事
1.get方法首先查詢session緩衝 (session緩衝就是hibernate的一級緩衝 這個概念大家應該清楚吧 )
2.get方法如果在session緩衝中找到了該id對應的對象,如果剛好該對象前面是被代理過的,如被load方法使用過,或者被其他關聯對象消極式載入過,那麼返回的還是原先的代理對象,而不是實體類對象。
3.如果該代理對象還沒有載入實體資料(就是id以外的其他屬性資料),那麼它會查詢二級緩衝或者資料庫來載入資料,但是返回的還是代理對象,只不過已經載入了實體資料。
(這個代理實際就是空的對象 並沒有去資料庫查詢得到的 我們叫代理對象,如果 去資料庫查詢了 返回到了這個對象 我們叫實體物件 就是這個對象真實存在)
我在總結性一句話這2者區別
get方法首先查詢session緩衝,沒有的話查詢二級緩衝,最後查詢資料庫;反而load方法建立時首先查詢session緩衝,沒有就建立代理,實際使用資料時才查詢二級緩衝和資料庫
桃花塢裡桃花庵,桃花庵下桃花仙; 桃花仙人種桃樹,又摘桃花賣酒錢。 酒醒只在花前坐,酒醉換來花下眠; 半醒半醉日複日,花落花開年複年。 但願老死花酒間,不願鞠躬車馬前; 車塵馬足富者趣,酒盞花枝貧者緣。 若將富貴比貧賤,一在平地一在天; 若將貧賤比車馬,他得驅馳我得閑。 別人笑我忒瘋癲,我笑別人看不穿; 不見五陵豪傑墓,無花無酒鋤做田。