hibernate中get和load的區別

時間 2022-02-28 15:40:16

1樓:匿名使用者

hibernate中get方法和load方法的根本區別

如果你使用load方法,hibernate認為該id對應的物件(資料庫記錄)在資料

庫中是一定存在的,所以它可以放心的使用,它可以放心的使用**來延遲載入該物件。在用到物件中的其他屬性資料時才查詢資料庫,但是萬一資料庫中不存在該

記錄,那沒辦法,只能拋異常objectnotfoundexception,所說的load方法拋異常是指在使用該物件的資料時,資料庫中不存在該資料

時拋異常,而不是在建立這個物件時。由於session中的快取對於hibernate來說是個相當廉價的資源,所以在load時會先查一下

session快取看看該id對應的物件是否存在,不存在則建立**。所以如果你知道該id在資料庫中一定有對應記錄存在就可以使用load方法來實現延

遲載入。

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

雖然好多書中都這麼說:「get()永遠只返回實體類」,但實際上這是不正確的,get方法如果在session快取中找到了該id對應的物件,如果剛好該

物件前面是被**過的,如被load方法使用過,或者被其他關聯物件延遲載入過,那麼返回的還是原先的**物件,而不是實體類物件,如果該**物件還沒有

載入實體資料(就是id以外的其他屬性資料),那麼它會查詢二級快取或者資料庫來載入資料,但是返回的還是**物件,只不過已經載入了實體資料。

前面已經講了,get方法首先查詢session快取,沒有的話查詢二級快取,最後查詢資料庫;反而load方法建立時首先查詢session快取,沒有就建立**,實際使用資料時才查詢二級快取和資料庫。

總之對於get和load的根本區別,一句話,hibernate對於load方法認為該資料在資料庫中一定存在,可以放心的使用**來延遲載入,如果在使用過程中發現了問題,就拋異常;而對於get方法,hibernate一定要獲取到真實的資料,否則返回null。

2樓:匿名使用者

hibernate的get/load的根本區別分為4點:第一點是:load會丟擲異常,get會返回空,一般採用的load方法。

第二點是:get只返回實體物件例項。而load返回的是**類實體物件例項。

第三點是:get方法只能使用一級快取。而load可以使用一級和二級快取。

第四點是:都是通過id得到單個物件的方法。

3樓:哈魯擼啊擼

1.get()採用立即載入方式,而load()採用延遲載入;

get()方法執行的時候,會立即向資料庫發出查詢語句,而load()方法返回的是乙個**(此**中只有乙個id屬性),只有等真正使用該物件屬性的時候,才會發出sql語句

2.如果資料庫中沒有對應的記錄,get()方法返回的是null.而load()方法出現異常objectnotfoundexception

hibernate中get方法和load方法的區別

4樓:吉祥二進位制

簡單總結: 一句話,hibernate對於load方法認為該資料在資料庫中一定存在。

可以放心的使用**來延遲載入,如果在使用過程中發現了問題,只能拋異常;而對於get方法,hibernate一定要獲取到真實的資料,否則返回null。

在hibernate中想使用left join查詢

拉破輪 hql不支援on關鍵字,如果要多表聯查可以在hbm.xml中配置關聯對映,並修改實體類配合對映,然後使用 select x1 from t1 left join fetch t2 where t2.xx 這種形式將關聯屬性以表連線形式抓取出來。具體配置可搜尋hibernate關聯對映,網上很...

hibernate中的query怎麼取到每個欄位的值

邗啟 教你個方法 list result session.createsqlquery sql setresulttransformer transformers.alias to entity map list 用這個方法可以把資料庫查詢出來的每一行封裝成一個map型別,key為資料庫欄位,val...

hibernate的對映檔案中generator的屬性問題

1 assigned 主鍵由外部程式負責生成,無需hibernate參與。2 hilo 通過hi lo 演算法實現的主鍵生成機制,需要額外的資料庫表儲存主 鍵生成歷史狀態。3 seqhilo 與hilo 類似,通過hi lo 演算法實現的主鍵生成機制,只是主鍵歷史 狀態儲存在sequence中,適用...