欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

hibernate一级缓存

程序员文章站 2022-05-09 22:30:15
...
Hibernate一级缓存Hibernate的一级缓存是由Session提供的,因此它只存在于Session的生命周期中,当程序调用save(),update(),saveOrUpdate()等方法,及调用查询接口list,filter,iterate时,如Session缓存中不存在相应的对象,Hibernate会把该对象加入到一级缓存中,当Session关闭时,该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方法的获得对象过程。所以说,如果数据库中不存在该记录,异常是在程序访问该对象属性时抛出的,而不是在创建这个对象时就抛出。