Hibernate 中 get和load方法的區別

 

hibernate支持延遲加載,也稱爲懶加載,就是在使用對象的時候纔會發送sql語句,不使用對象的時候就不會發送sql語句。只有在session打開狀態下,懶加載纔有效。sql

1、getload在懶加載方面的區別數據庫

get對持久類自己,不支持懶加載,直接載入實體類。緩存

load對持久類自己,支持懶加載,直接載入實體類。session

getload,對其關係屬性(many-to-oneone-to-one屬性) 都支持懶加載spa

 2、getload在查詢持久類自己的機制區別hibernate

 

1getload方法都是根據id去得到對應數據的,可是得到機制不一樣代理

get方法hibernate會去確認該id對應的數據是否存在,它首先會去session中去查詢(session緩存其實就hibernate的一級緩存),若是沒有,再去二級緩存中去查詢,若是再沒有,就去數據庫中查詢,仍然沒有找到的話,就返回null對象

而使用load方法的話hibernate會認定該id對應的數據必定存在,它也會先去session緩存中去查找,若是沒有找到,hibernate會根據lazy屬性值來肯定是否使用延遲加載。若是lazy=‘true’ ,就使用延遲加載,返回該代理對象,等到真正訪問到該對象的屬性時纔會去二級緩存中查詢,若是沒有,再去數據庫中查詢,若是尚未,就拋出org.hibernate.ObjectNotFoundException異常。若是lazy='false' 則不使用延遲加載,這是load的訪問機制就和get同樣了。get

2、對於loadget方法返回類型:io

雖然好多書中都這麼說:「get()永遠只返回實體類,但實際上這是不正確的,get方法若是在 session緩存中找到了該id對應的對象,若是恰好該對象前面是被代理過的,如被load方法使用過,或者被其餘關聯對象延遲加載過,那麼返回的仍是原先的代理對象,而不是實體類對象,若是該代理對象尚未加載實體數據(就是id之外的其餘屬性數據),那麼它會查詢二級緩存或者數據庫來加載數據,可是 返回的仍是代理對象,只不過已經加載了實體數據。

 總之對於getload的根本區別,一句話,hibernate對於load方法認爲該數據在數據庫中必定存在,能夠放心的使用代理來延遲加載,若是在使用過程當中發現了問題,只能拋異常;而對於get方法,hibernate必定要獲取到真實的數據,不然返回null

相關文章
相關標籤/搜索