1. 程式人生 > >hibernate 中的get與load的區別

hibernate 中的get與load的區別

Hibernate get和load區別

get和load方式是根據id取得一個記錄
下邊詳細說一下get和load的不同,因為有些時候為了對比也會把find加進來。

1.從返回結果上對比:
load方式檢索不到的話會丟擲org.hibernate.ObjectNotFoundException異常
get方法檢索不到的話會返回null

2.從檢索執行機制上對比: get方法和find方法都是直接從資料庫中檢索 而load方法的執行則比較複雜首先查詢session的persistent Context中是否有快取,如果有則直接返回 如果沒有則判斷是否是lazy,如果不是直接訪問資料庫檢索,查到記錄返回,查不到丟擲異常 如果是lazy則需要建立代理物件,物件的initialized屬性為false,target屬性為null 在訪問獲得的代理物件的屬性時,檢索資料庫,如果找到記錄則把該記錄的物件複製到代理物件的target上,並將initialized=true,如果找不到就丟擲異常。

3.根本區別說明
如果你使用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快取,沒有就建立代理,實際使用資料時才查詢二級快取和資料庫。

4.簡單總結

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

相關推薦

hibernate架構之sessiongetload方法的區別

r.java one 升級版 數據庫 apache appenders 進行 方法 main hibernate是一個用於連接數據庫的升級版JDBC,與一般JDBC不同的是,hibernate架構是通過hql進行查找,通過session建立連接。其工作原理是:將實例分為瞬時

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

Hibernategetload方法的區別

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

hibernate getload區別

轉自:http://blog.163.com/love-love-l/blog/static/210783042009618919985/#comment=fks_083070085095080069081094083095086087081068092085086071 從網上抄了兩片。感覺不錯,呵呵。

Hibernateget()和load()方法的區別

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

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

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

Hibernategetload方法

get方法和find方法都是直接從資料庫中檢索,而load方法的執行則比較複雜。首先查詢session的persistent Context中是否有快取,如果有則直接返回如果沒有則判斷是否是lazy,如果不是直接訪問資料庫檢索,查到記錄返回,查不到丟擲異常;如果是lazy則需要建立代理物件,物件的initia

hibernate getload區別

Hibernate get和load區別 get和load方式是根據id取得一個記錄 下邊詳細說一下get和load的不同,因為有些時候為了對比也會把find加進來。 1.從返回結果上對比: load方式檢索不到的話會丟擲org.hibernate.Ob

Hibernateget方法和load方法的區別

pub 機制 否則 on() color 檢索 不存在 bsp 數據庫查詢 1.從返回結果上對比: load方式檢索不到的話會拋出org.hibernate.ObjectNotFoundException異常; get方法檢索不到的話會返回null; 2.從檢索執行機制上對

hibernate查詢資料的 sessiongetload區別:

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

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

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

99%的人都理解錯了HTTPGETPOST的區別

tex method 無限 ext 一點 size 環境 ans 交通 GET和POST是HTTP請求的兩種基本方法,要說它們的區別,接觸過WEB開發的人都能說出一二。 最直觀的區別就是GET把參數包含在URL中,POST通過request body傳遞參數。

HibernategetCurrentSession()openSession()的區別及應用

rop 綁定 cto 關閉 hiberna code pre thread 線程 獲取openSession和CurrentSession: session=HibernateSessionFactory.getSession(); session=HibernateSes

99%的人可能都理解錯了HTTPGETPOST的區別

角色 ref 裏的 們的 接受 遺憾 為什麽 eth ges GET和POST是HTTP請求的兩種基本方法,要說它們的區別,接觸過WEB開發的人都能說出一二。 最直觀的區別就是GET把參數包含在URL中,POST通過request body傳遞參數。 你可能自己寫過無數個G

淺談HTTPGetPost的區別(轉)

     Http定義了與伺服器互動的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,我們可以這樣認為:一個URL地址,它用於描述一個網路上的資源,而HTTP中的GET,POST,PUT,DELETE就對應著對這個

HTTPGETPOST的區別

Get和Post是HTTP請求的兩種基本方法, GET POST Get引數包含在URL。 Post通過 request body 傳遞引數。 Get在瀏覽器回退時

HibernatecreateQuerycreateSQLQuery的區別

前者用的hql語句進行查詢,後者可以用sql語句查詢. 前者以Hibernate生成的Bean為物件裝入list返回,hql是Hibernate實現的比較oo的sql語句. 後者則是以物件陣列進行儲存,如果查詢的記錄屬性沒能封裝成物件,則可以用物件陣列來取. 原來的查詢

HibernateaddEntityTransformers.aliasToBean的區別

addEntity只適用於存在Person實體的,如果hibernate中沒有進行Person對映就不可行,如系統中只存在一個JavaBean,可通過下面方法:   Java程式碼   List list = getSession().createSQLQuery("