Hibernate的一級緩存是由Session提供的,因此它只存在於Session的生命周期中,當程序調用save(),update(),saveOrUpdate()等方法,及調用查詢接口list,filter,iterate時,如Session緩存中不存在相應的對象,Hibernate會把該對象加入到一級緩存中,當Session關閉時,該Session所管理的一級緩存也會立即被清除。

Java代碼 
  1. 注意:Hibernate的一級緩存是Session所內置的,不能被卸載,也不能進行任何配置  
注意:Hibernate的一級緩存是Session所內置的,不能被卸載,也不能進行任何配置


一級緩存采用的是key-value的Map方式來實現的,在緩存實體對象時,對象的主關鍵字ID是Map的key,實體對象就是對應的value。所以說,一級緩存是以實體對象為單位進行存儲的,在訪問時使用的是關鍵字ID。雖然,Hibernate對一級緩存使用的是自動維護的功能,沒有提供任何配置功能,但是可以通過Session中提供的方法來對一級緩存的管理進行手工干預。

 

get與load的區別

使用get方法獲得持久化對象時,首先查找Session緩存(一級緩存)是否有該對象,如果有,則獲得該對象;如果沒有,就會訪問數據庫,如果數據庫中找不到數據,則返回null。
load方法也是獲得數據,但不同的地方是load方法已經假定數據庫中一定存在該數據,如果在數據庫中找不到該數據,則會拋出一個org.hibernate.ObjectNotFoundException異常。
load方法獲得對象的過程是:load方法首先在Session緩存中查找對象,如果找不到則查找SessionFactory緩存(二級緩存),如果再找不到則訪問數據庫。值得注意的是,load方法是假定數據庫中一定有該數據,所以使用代理來延遲加載對象,只有在程序中使用了該對象的屬性(非主鍵屬性)時,Hibernate才會進入load方法的獲得對象過程。所以說,如果數據庫中不存在該記錄,異常是在程序訪問該對象屬性時拋出的,而不是在創建這個對象時就拋出。