hibernate的get方法和load方法區別
阿新 • • 發佈:2017-12-31
返回 exception 二級緩存 查詢 get方法 機制 als 分情況討論 如果
讀者需註意:Hibernate版本不同,運行機制不太一樣,以下是hibernate3.x作為講解
get方法:
Hibernate會確認一下該id對應的數據是否存在,首先在session緩存中查找,然後在二級緩存中查找,還沒有就查詢數據庫,數據庫中沒有就返回null
結論:對於get方法,hibernate一定要獲取到真實的數據,否則返回null
load方法:
根據映射文件上類級別的lazy屬性的配置(默認為true),分情況討論;
若為true,先在Session緩存中查找,看看該id對應的對象是否存在,不存在則使用延遲加載,返回實體的代理類對象(該代理類為實體類的子類,由CGLIB動態生成)。
等到具體使用該對象(除獲取OID以外)的時候,再查詢二級緩存和數據庫,若仍沒發現符合條件的記錄,則會拋出一個ObjectNotFoundException。
若為false,和get方法查找順序一樣,只是最終若沒發現符合條件的記錄,則會拋出一個ObjectNotFoundException。
結論:對於load方法認為該數據在數據庫中一定存在,可以放心的使用代理來延遲加載,如果在使用過程中發現了問題,只能拋異常
hibernate的get方法和load方法區別