Hibernate的一级缓存是由Session提供的,因此它只存在于Session的生命周期中,当程序调用save(),update(),saveOrUpdate()等方法,及调用查询接口list,filter,iterate时,如Session缓存中不存在相应的对象,Hibernate会把该对象加入到一级缓存中,当Session关闭时,该Session所管理的一级缓存也会立即被清除。

  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方法的获得对象过程。所以说,如果数据库中不存在该记录,异常是在程序访问该对象属性时抛出的,而不是在创建这个对象时就抛出。