3
回答
hibernate的一级缓存是没法禁止的,那spring-data-jpa为什么没有缓存呢

想要禁止掉hibernate的一级缓存,但是查询了很多资料表明不能禁止.然后想到jpa的实现hibernate,其中有框架spring-data-jpa,那它的缓存又是怎么处理的呢?查了很多资料没找到原因.求各位解惑!

<无标签>
举报
鱼丸和粗面
发帖于3个月前 3回/77阅

spring-data-jpa既然使用了hibernate作为实现,就一定有一级缓存,不相信的话你可以试试在一个事务中把相同的jpa接口连续调用四次,只会出现一次sql执行的。

然后你问它的缓存是如何处理的?最简单的方法是跟断点,一步一步的看它到底在干嘛。

我以CrudRepository.findOne(xxx)为例,下面是源码位置,

其中1050行的方法算是比较明显了,1052行获取的session就是hibernate的session

跟进去

从115行,不看里面的方法我们也知道,这个session同样是从sessionFactory中取得的。所以符合hibernate中一级缓存的一切特性。

--- 共有 3 条评论 ---
鱼丸和粗面 回复 @哎码 : 我本来一直疑惑的是hibernate的缓存同步策略,就是用hibernate的session查询时候,修改了实体,flush就会自动更新数据库,而spring-data-jpa就不会,听你这么一说,豁然开朗了.谢谢啦!! 3个月前 回复
哎码查询。最后说一下,都是假设,因为我学hibernate的时候已经是很久之前了,版本改变可能会导致这些都不对了。 3个月前 回复
哎码然后说一级缓存如何关闭,首先我没有尝试过这个需求,所以说的都是假设。 一级缓存是和session的生命周期相同的,也就是说在同一个session中,除非你调用clear()/evict()方法,否则不会出现“第二个缓存”,这个引号是指就算出现第二个其实也是同一个,只不过是对缓存做了操作。 其次非要关掉一级缓存,我建议使用hql/sql,这两个是对实体中属性的查询,而不是session对实体的查 3个月前 回复
顶部