1. 程式人生 > >hibernate的get方法和load方法區別

hibernate的get方法和load方法區別

返回 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方法區別