get和load方式是根據id取得乙個記錄
下邊詳細說一下get和load的不同,因為有些時候為了對比也會把find加進來。
[color=red][b]1.從返回結果上對比[/b][/color]
load方式檢索不到的話會丟擲org.hibernate.objectnotfoundexception異常
get方法檢索不到的話會返回null
[color=red][b]2.從檢索執行機制上對比[/b][/color]
get方法和find方法都是直接從資料庫中檢索 而load方法的執行則比較複雜首先查詢session的persistent context中是否有快取,如果有則直接返回 如果沒有則判斷是否是lazy,如果不是直接訪問資料庫檢索,查到記錄返回,查不到丟擲異常 如果是lazy則需要建立**物件,物件的initialized屬性為false,target屬性為null 在訪問獲得的**物件的屬性時,檢索資料庫,如果找到記錄則把該記錄的物件複製到**物件的target上,並將initialized=true,如果找不到就丟擲異常。
[size=medium][color=red][b]3.根本區別說明[/b][/color][/size]
如果你使用load方法,hibernate認為該id對應的物件(資料庫記錄)在資料庫中是一定存在的,所以它可以放心的使用,它可以放心的使用**來 延遲載入該物件。在用到物件中的其他屬性資料時才查詢資料庫,但是萬一資料庫中不存在該記錄,那沒辦法,只能拋異常。所說的load方法拋異常是指在使用 該物件的資料時,資料庫中不存在該資料時拋異常,而不是在建立這個物件時(注意:這就是由於「延遲載入」在作怪)。
由於session中的快取對於hibernate來說是個相當廉價的資源,所以在load時會先查一下session快取看看該id對應的物件是否存在,不存在則建立**。所以如果你知道該id在資料庫中一定有對應記錄存在就可以使用load方法來實現延遲載入。
對於get方法,hibernate會確認一下該id對應的資料是否存在,首先在session快取中查詢,然後在二級快取中查詢,還沒有就查資料庫,資料庫中沒有就返回null。
對於load和get方法返回型別:雖然好多書中都這麼說:「get()永遠只返回實體類」,但實際上這是不正確的,get方法如果在 session快取中找到了該id對應的物件,如果剛好該物件前面是被**過的,如被load方法使用過,或者被其他關聯物件延遲載入過,那麼返回的還是 原先的**物件,而不是實體類物件,如果該**物件還沒有載入實體資料(就是id以外的其他屬性資料),那麼它會查詢二級快取或者資料庫來載入資料,但是 返回的還是**物件,只不過已經載入了實體資料。
[color=red][b]get方法首先查詢session快取,沒有的話查詢二級快取,最後查詢資料庫;[/b][/color]反而load方法建立時首先查詢session快取,沒有就建立**,實際使用資料時才查詢二級快取和資料庫。
[size=medium][color=red][b]4.簡單總結[/b][/color][/size]
總之對於get和load的根本區別,一句話,[color=blue][b]hibernate對於load方法認為該資料在資料庫中一定存在,可以放心的使用**來延遲載入,如果在使用過程中發現了問題,只能拋異常;而對於get方法,hibernate一定要獲取到真實的資料,否則返回null。[/b][/color]
lockInterruptibly和lock的區別
size medium lock 拿不到lock就不罷休,不然執行緒就一直block。lockinterruptibly會優先響應執行緒中斷,處理響應的方式是丟擲interruptedexception。size 可以從原始碼看出來的 private void doacquireinterrupti...
hibernate get和load方法異同
load和get一共是2個區別 先講第乙個 延遲載入 load是true而get是false 意思就是 load採用的是延遲載入的方式 而get不是,hibernate思想是 既然這個方法支援延遲載入 他就認為這個物件一定在資料庫存在,在你宣告 tfaq tfag2 tfaq sess.load t...
Hibernate get與load的區別
hibernate 中有兩個極為相似的方法get 與load 他們都可以通過指定的實體類與id從資料庫中讀取資料,並返回對應的例項,但hibernate 不會搞兩個完全一樣的方法的,它們間的不同在於 hibernate 認為該id對應的物件 資料庫記錄 在資料庫中是一定存在的,所以它可以放心的使用,...