1. 程式人生 > >Hibernate中get和load的區別

Hibernate中get和load的區別

實體對象 alt 返回 images get .get 技術 log 查詢語句

在Hibernate中我們知道如果要從數據庫中得到一個對象,通常有兩種方式,一種是通過session.get()方法,另一種就是通過session.load()方法,然後其實這兩種方法在獲得一個實體對象時是有區別的,在查詢性能上兩者是不同的。

一、load方法

當使用load方法來得到一個對象時,此時hibernate會使用延遲加載的機制來加載這個對象,即:當我們使用session.load()方法來加載一個對象時,此時並不會發出sql語句,當前得到的這個對象其實是一個代理對象,這個代理對象只保存了實體對象的id值,只有當我們要使用這個對象,得到其它屬性時,這個時候才會發出sql語句,從數據庫中去查詢我們的對象。

技術分享

我們可以看到,如果我們僅僅是通過load來加載我們的User對象,此時從控制臺我們會發現並不會從數據庫中查詢出該對象,即並不會發出sql語句,但如果我們要使用該對象屬性時:

技術分享

此時在控制臺就會打印出sql語句,並會將該對象從數據庫中查詢出來:

技術分享

當在數據庫表中查不到數據的時候,就會拋出”對象找不到”異常,而不是空指針異常:

技術分享

二、get方法

相對於load的延遲加載方式,get就直接的多,當我們使用session.get()方法來得到一個對象時,不管我們使不使用這個對象,此時都會發出sql語句去從數據庫中查詢出來:

技術分享

此時我們通過get方式來得到user對象,但是我們並沒有使用它,但控制臺會輸出sql的查詢語句:

技術分享

當在數據庫表中查詢不出結果的時候,會返回一個null:

技術分享

三、總結

load為延遲加載,get為及時加載,都是通過id去找數據,load是到緩存裏面去找id,如果緩存沒有,再到數據庫裏面找。當你不使用實體的屬性時,它是不會去找的。

get是馬上就去數據庫裏面找,不管你用不用。

由此可以看出,load加載的優勢,當表的數據量大的時候,不建議一來就把數據庫裏面的內容加載出來。

Hibernate中get和load的區別