Hibernate查詢之get和load的區別

2021-08-21 10:38:26 字數 1307 閱讀 2692

load方式檢索不到的話會丟擲org.hibernate.objectnotfoundexception異常

get方法檢索不到的話會返回null

get方法和find方法都是直接從資料庫中檢索 ,而load方法的執行則比較複雜

■ 首先查詢session的persistent context中是否有快取,如果有則直接返回

■ 如果沒有則判斷是否是lazy,如果不是直接訪問資料庫檢索,查到記錄返回,查不到丟擲異常

■ 如果是lazy則需要建立**物件,物件的initialized屬性為false,target屬性為null

■ 在訪問獲得的**物件的屬性時,檢索資料庫,如果找到記錄則把該記錄的物件複製到**物件的target上,並將initialized=true,如果找不到就丟擲異常 。

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

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

■ 對於load和get方法返回型別:雖然好多書中都這麼說:「get()永遠只返回實體類」,但實際上這是不正確的,get方法如果在session快取中找到了該id對應的物件,如果剛好該物件前面是被**過的,如被load方法使用過,或者被其他關聯物件延遲載入過,那麼返回的還是原先的**物件,而不是實體類物件,如果該**物件還沒有載入實體資料(就是id以外的其他屬性資料),那麼它會查詢二級快取或者資料庫來載入資料,但是返回的還是**物件,只不過已經載入了實體資料。

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

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

Hibernate之批量查詢

hql查詢 string hql from student id是student 類中的屬性,不是資料庫的字段 query query seesion.createquery hql list list query.list 設定引數 string hql from student where id...

Hibernate之load和get的區別

load和get都會可以起到從資料庫中獲取持久態資料的作用,但是還有些稍微的區別的。test expected illegalargumentexception.class public void testlazyload throws exception catch objectnotfounde...

load和get之Hibernate的延遲載入機制

在hibernate中 如果你使用load方法,hibernate認為該id對應的物件 資料庫記錄 在資料庫中是一定存在的,所 以它可以放心的使用,它可以放心的使用 來延遲載入該物件。在用到物件中的其他屬性資料時才查詢資料庫,但是萬一資料庫中不存在該記錄,那沒辦法,只能拋異常 objectnotfo...