hibernate支持延遲加載,也稱爲懶加載,就是在使用對象的時候纔會發送sql語句,不使用對象的時候就不會發送sql語句。只有在session打開狀態下,懶加載纔有效。sql
1、get和load在懶加載方面的區別數據庫
get對持久類自己,不支持懶加載,直接載入實體類。緩存
load對持久類自己,支持懶加載,直接載入實體類。session
get和load,對其關係屬性(many-to-one,one-to-one屬性) 都支持懶加載spa
2、get和load在查詢持久類自己的機制區別hibernate
1、get和load方法都是根據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、對於load和get方法返回類型:io
雖然好多書中都這麼說:「get()永遠只返回實體類」,但實際上這是不正確的,get方法若是在 session緩存中找到了該id對應的對象,若是恰好該對象前面是被代理過的,如被load方法使用過,或者被其餘關聯對象延遲加載過,那麼返回的仍是原先的代理對象,而不是實體類對象,若是該代理對象尚未加載實體數據(就是id之外的其餘屬性數據),那麼它會查詢二級緩存或者數據庫來加載數據,可是 返回的仍是代理對象,只不過已經加載了實體數據。
總之對於get和load的根本區別,一句話,hibernate對於load方法認爲該數據在數據庫中必定存在,能夠放心的使用代理來延遲加載,若是在使用過程當中發現了問題,只能拋異常;而對於get方法,hibernate必定要獲取到真實的數據,不然返回null。