我试图理解hibernate查询缓存是如何工作的。 我现在看到的是,当我将新实体插入数据库时,Hibernate不会自动更新其二级缓存(尽管我只使用Hibernate调用)。 我发现使其工作的唯一方法是在插入新实体后手动清理缓存。
这是更具体的例子。 我有一个名为Container的持久化实体,可以有很多项。我希望缓存所有项目:
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) class Item { // rest of the code ... } class Container { @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public List getItems() { ... } // rest of the code ... }
我注意到的问题是,当我:
1)从数据库中读取一些容器到内存中(连同相应的项目)
String hql =
"from Container c left join fetch c.items where c.type = 1";
List<Item> list = hibernateTemplate.find(hql);
2)为所选容器插入新物品
hibernateTemplate.save(item)
3)重复第一步
然后在第3步中我看不到我在第二步中插入的项目。
只有在插入新项目后手动清理缓存时才能看到它们:
sessionFactory.evictCollection("Container.items", updatedContainerId)
我的直觉告诉我,Hibernate应该自动执行这样的缓存失效。有没有人看到它的工作?我做错了还是不支持?
提前感谢您的回答。 问候 汤姆
答案 0 :(得分:6)
您可能会发现我的关于查询缓存工作的博客有助于了解查询缓存的作用以及它可能无法按您认为的方式工作的原因:
答案 1 :(得分:1)
Hibernate使用由查询(或查询名称)和指定参数的值组成的密钥来存储查询中的数据。我想在修改数据时无法轻易知道要使无效的缓存。
要解决此问题,您只需致电SessionFactory.evictQueries。
答案 2 :(得分:-1)
是的,本机SQL查询缺少查询缓存自动失效。对于HQL查询,如果参与查询的任何表对任何对象都有INSERT / UPDATE / DELETE,则只清除所有缓存。
因此,您可以尝试Hibernate Dynamic SQL Cache项目,它旨在通过自动更新SQL查询缓存而不会失效来解决此问题。
P.S。 “比尔蜥蜴”感谢你的理解:)