Hibernate中load和get的區別

2021-06-18 00:44:53 字數 1872 閱讀 8306

hibernate中session.load/get方法均可以根據指定的實體類和id從資料庫讀取記錄,並返回與之對應的實體物件。其區別在於

xp系統之家官網

:1.get()方法直接返回實體類,load()方法可以返回實體的**類例項。

2.hibernate load是採用延遲機制(當lazy屬性為true時) 而get不採用延遲機制(get語句馬上讀庫)

3.找不到符合條件的資料 get方法將返回null

load將會報出objectnotfoundexcepion

4.get支援多型查詢,load只有在lazy=false的情況下才支援多型查詢

所謂多型查詢,就是可以明確區分載入的是

什麼型別的物件,load採用**機制無法支援

延遲載入:hibernate盡量延遲向資料庫傳送sql,它自己有乙個緩衝區,先把sql放在裡面,最後一起傳送,減少網路開銷和資料庫開銷。

load方法原理:

當物件.hbm.xml配置檔案元素的lazy屬性設定為true時,呼叫load()方法時則返回持久物件的**類例項,此時的**類例項是由執行時動態生成的類,該**類例項包括原目標物件的所有屬性和方法,該**類例項的屬性除了id不為null外,所在屬性為null值,檢視日誌並沒有hibernate sql輸出,說明沒有執行查詢操作,當**類例項通過get***()方法獲取屬性值時,hiberante才真正執行資料庫查詢操作。

注意:01.studenteh s=(studenteh)session.load(studenteh.class,10);

02.03.system.out.println(s.getid());

這兩條語句同樣不會產生sql語句,因為session.load後會在hibernate的一級快取裡存放乙個map物件,該map的key就是id的值,但是當你getid()時,它是從一級快取裡取map的key值,而不去執行資料庫查詢。

當物件.hbm.xml配置檔案元素的lazy屬性設定為false時,呼叫load()方法則是立即執行資料庫並直接返回實體類,並不返回**類。而呼叫get()方法時不管lazy為何值,都直接返回實體類。

get方法原理:

get方法,hibernate會確認一下該id對應的資料是否存在,首先在session快取中查詢,然後在二級快取中查詢,還沒有就查資料庫,資料庫中沒有就返回null。

get方法如果在session快取中找到了該id對應的物件,如果剛好該物件前面是被**過的,如被load方法使用過,或者被其他關聯物件延遲載入過,那麼返回的還是原先的**物件,而不是實體類物件,如果該**物件還沒有載入實體資料(就是id以外的其他屬性資料),那麼它會查詢二級快取或者資料庫來載入資料,但是返回的還是**物件,只不過已經載入了實體資料。

總結描述:

如果使用load方法,hibernate認為該id對應的物件(資料庫記錄)在資料庫中是一定存在的,所以它可以放心的使用**來延遲載入該物件。在用到物件中的其他屬性資料時才查詢資料庫,但是萬一資料庫中不存在該記錄,那沒辦法,只能拋異常,所說的load方法拋異常是指在使用該物件的資料時,資料庫中不存在該資料時拋異常,而不是在建立這個物件時。由於session中的快取對於hibernate來說是個相當廉價的資源,所以在load時會先查一下session快取看看該id對應的物件是否存在,不存在則建立**。所以如果你知道該id在資料庫中一定有對應記錄存在就可以使用load方法來實現延遲載入。

而對於get方法,hibernate一定要獲取到真實的資料,否則返回null。

自己在開發過程中遇到的問題:

我們用myeclipse hibernate工具通過資料庫生成的dao類,它的findbyid方法是用的session.get()方法,這是即時獲得pojo物件,如果是load方法,在執行完load後如果關閉了session,那在接下來用到這個pojo物件時就會報session已關閉的錯誤。

Hibernate中get和Load比較

load支援延遲載入.它認為該資料是一定存在的,所以會使用 進行延遲載入.若資料不存在,只能拋異常.get方法,不支援延遲載入.若資料不存在就直接返回null.load方法拋異常是指在使用該物件的資料時,資料庫中不存在該資料時拋異常,而不是在建立這個物件時。在load時會先去查一下session快取...

hibernate中get和load載入的不同之處

在hibernate中我們知道如果要從資料庫中得到乙個物件,通常有兩種方式,一種是通過session.get 方法,另一種就是通過session.load 方法,然後其實這兩種方法在獲得乙個實體物件時是有區別的,在查詢效能上兩者是不同的。1.首先,如果用的是get去載入,然後得到的乙個物件,這個過程...

Hibernate中get和load方法的區別

這次我們來談一下 hibernate3.2session 載入資料時 get和 load 方法的區別,其實這個在網上有很多的論述,可大多語焉不詳或經不起實踐的推敲,讓很多初學者學的滿腹疑竇,現在我給大家講解一下 1.對於 get方法,hibernate 會確認一下該 id對應的資料是否存在,首先在 ...