自动查询缓存失效

4
我在尝试理解Hibernate查询缓存是如何工作的。 现在我所看到的是,当我使用Hibernate调用时向数据库插入新实体时,Hibernate不会自动更新其二级缓存。 我发现使缓存生效的唯一方法是手动清除缓存后插入新实体。 以下是一个更具体的示例: 我有一个名为Container的持久化实体,它可以包含许多Item。我希望将所有项都缓存下来: ``` @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) class Item { // 其余代码... }
class Container { @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public List getItems() { ... }
// 其余代码... } ```
我注意到的问题是: 当我: 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) 重复第一步
然后在第三步中,我无法看到我在第二步中插入的项目。只有在手动清除缓存后插入新项目后,我才能看到它们:

   sessionFactory.evictCollection("Container.items", updatedContainerId)

我的直觉告诉我Hibernate应该自动执行这样的缓存失效。有人见过它正常工作吗?是我做错了什么还是不支持呢?

提前感谢您的回答。 问候 Tom


我刚刚在另一天回答了这个问题:https://dev59.com/U1LTa4cB1Zd3GeqPdtPk#10828200 - Steve Ebersole
3个回答

6

能否在回答中至少加入一些有关该主题问题的最基本解释? - Scadge

1
Hibernate通过使用由查询(或查询名称)和指定参数的值组成的键来存储查询数据。我猜当您修改数据时,它无法轻松地知道要使哪个缓存失效。
为了解决这个问题,您应该简单地调用SessionFactory.evictQueries

-1

是的,对于本地SQL查询,查询缓存自动失效功能是不存在的。对于HQL查询,如果查询中涉及的任何表格有任何对象的INSERT/UPDATE/DELETE操作,则它只会清除所有缓存。

因此,您可以尝试Hibernate Dynamic SQL Cache项目,它旨在通过自动更新SQL查询缓存而不进行失效来解决此问题。

P.S. "Bill the Lizard" 感谢您的理解 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接