1. 程式人生 > >Hibernate查詢之get和load的區別

Hibernate查詢之get和load的區別

一、.從返回結果上對比

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查詢getload區別

一、.從返回結果上對比 load方式檢索不到的話會丟擲org.hibernate.ObjectNotFoundException異常 get方法檢索不到的話會返回null 二、.從檢索執行機制上對比 get方法和find方法都是直接從資料庫中檢索 ,而

Hibernate中Sessiongetload方法的真正區別

repl .get user href 獲得 tno lose 錯誤 ftw 最近在學習SHH框架中的hibernate,對Session的get和load方法,有點混不清楚,不知道區別在哪,或者對它們的區別感觸不深。所以百度了一下,結果問題來了。百度的結果和實際測試

hibernate延遲載入(getload區別)

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

Hibernate中session get load區別,物件生命週期

Hibernate中會話get和load的區別 get()方法會立即查詢(快取中有則不查詢),load()懶載入,直到你需要用到資料的時候才去查資料庫 找不到物件時get()是返回NULL,load()會拋異常; 因此使用load()方法時,要確認查詢的主鍵ID是一定存在的。 loa

Hibernate(三)getload區別

1)在不考慮快取的情況下,get方法會在呼叫之後立即向資料庫傳送sql語句,返回持久化物件。 load方法會在呼叫後返回一個代理物件。 該代理物件只儲存了實體物件的id,直到使用物件的非主鍵屬性時才傳送sql語句。 2)查詢資料庫中不存在的資料時,get方

hibernate載入物件(getload區別)

在hibernate中我們知道如果要從資料庫中得到一個物件,通常有兩種方式: 通過session.get()方法和通過session.load()方法,然後其實這兩種方法在獲得一個實體物件時是有區別的

Hibernate深入get()與load()懶載入

get和load, 一個是直接載入,並不是直接去資料庫查詢,如果快取裡有,首先到快取裡找,快取分為一級快取和二級快取,首先到一級快取中查詢; 如果在session關閉之後進行獲取類的名字之類的屬性,依然會獲取到,例: Order od = (Order) session.g

經典面試題getpost區別(入門篇)

1.標準答案GET在瀏覽器回退時是無害的,而POST會再次提交請求。GET產生的URL地址可以被Bookmark,而POST不可以。GET請求會被瀏覽器主動cache,而POST不會,除非手動設定。GET請求只能進行url編碼,而POST支援多種編碼方式。GET請求引數會被完

Hibernate筆記6(getload)

session.load()和session.get() loadObject load(Class theClass,            Serializable id)            throws HibernateExceptionReturn the pe

hibernate查詢資料的 session中get load區別:

* 第一點.傳送SQL的時機: * load這個方法採用了一個技術.lazy延遲載入(懶載入).真正使用這個物件的資料的時候.(物件的資料不包括主鍵). * get這個方法是立即檢索.當執行session.get()方法的時候,馬上傳送SQL語句查詢.   * 第二點.返回的物件:

SSHhibernate——getload方法的區別

       hibernate查詢資料可以用get()和load()方法,但是它們的機制還有一些不同,下面講解具體的區別。 一、建實體類User,並配置對映檔案         因為實體類建立非常簡

Hibernateget()load()的區別

factory all htm on() 被調用 容易 transacti rip con Hibernate中根據Id單條查詢獲取對象的方式有兩種,分別是get()和load(),來看一下這兩種方式的區別。 1. get() 使用get()來根據ID進行單條查詢:

Hibernategetload區別

實體對象 alt 返回 images get .get 技術 log 查詢語句 在Hibernate中我們知道如果要從數據庫中得到一個對象,通常有兩種方式,一種是通過session.get()方法,另一種就是通過session.load()方法,然後其實這兩種方法在獲得

hibernateHibernateget()load()的區別

etime () bsp ava fin null void 自己 IT Hibernate中根據Id單條查詢獲取對象的方式有兩種,分別是get()和load(),來看一下這兩種方式的區別。 1. get() 使用get()來根據ID進行單條查詢: 1

分享知識-快樂自己:Hibernateget() load()、sava、update、savaOrUpdate、merge,不同處及執行原理?

1):Hibernate 中 get()  和 load() 有什麼不同之處? 1)Hibernate的 get方法,會確認一下該id對應的資料是否存在,首先在session快取中查詢,然後在快取中查詢,還沒有就查詢資料庫,資料庫中沒有就返回null。 2)Hibernate的 load方法載入

hibernate中session.get( , )session.load( , )的使用及區別

get(Class clazz,id)和load(Class clazz,id)都是用來根據主鍵的內容查詢資料庫中資料,並且返回相對應的類的物件 用法如下: public static void main(String[] args) { //讀取總的配置檔案 C

Hibernate中session.get()session.load()的區別

實際上,兩個方法都是用來從資料庫獲取物件,只不過實現機制不一樣而已。   1. session.load() 這種方式總是會返回一個代理而不是真正得去查詢資料庫。 在Hibernate裡面,代理是一個依據ID值獲取到的物件,該物件的屬性還沒有初始化,它看起來就是一個臨時的虛擬物件而已。

Hibernate單表操作(六)——查詢記錄get()與load()方法區別

在上一次的案例中,通過get或者load方法得到的結果一樣。 既然得到的結果一樣, 那麼  get和load方法查詢記錄的區別是什麼呢? 區別一: 在不考慮快取的情況下,get方法會在呼叫之後立即向

Hibernategetload方法的區別

load方法可返回沒有載入實體資料的代理類例項,而get方法永遠返回有實體資料的物件。(對於load和get方法返回型別:好多書中都說:“get方法永遠只返回實體類”,實際上並不正確,get方法如果在session快取中找到了該id對應的物件,如果剛好該物件前面是被代理過的,如被load方法使用過,或者被其他

hibernategetload方法的區別

get和load方法的區別 返回的資料 由於get方法是無延遲的,所以查不到資料直接返回null load是有延遲,基於延遲的機制,如果找不到資料就報異常 訪問資料庫時機 由於get方法是無延遲