4

我试图了解休眠查询缓存的真正工作原理。我现在看到的是,当我将新实体插入数据库时​​,Hibernate 不会自动更新其二级缓存(尽管我只使用 Hibernate 调用)。我发现让它工作的唯一方法是在插入新实体后手动清理缓存。

这是更具体的例子。我有一个名为 Container 的持久实体,它可以有许多项目。我想缓存所有项目:

@Cache(使用 = CacheConcurrencyStrategy.READ_WRITE)
类项目
{
  //剩下的代码...
}

类容器{
  @Cache(使用 = CacheConcurrencyStrategy.READ_WRITE)
公共列表 getItems() { ... } //剩下的代码... }

我注意到的问题是,当我:

1)从db中读取一些Containers到内存中(连同对应的item)

   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 应该自动执行这样的缓存失效。有没有人看到它工作?我做错了什么还是不支持?

提前感谢您的回答。问候汤姆

4

3 回答 3

6

您可能会发现我关于查询缓存工作的博客有助于理解查询缓存的作用以及为什么它可能无法按照您认为的方式工作:

于 2009-07-10T07:19:18.713 回答
1

Hibernate 使用由查询(或查询名称)和指定参数的值组成的键来存储来自查询的数据。我想当您修改数据时,它不能轻易知道要使哪些缓存无效。

要解决此问题,您只需调用SessionFactory.evictQueries 即可

于 2008-10-03T12:05:38.520 回答
-1

是的,本机 SQL 查询不存在查询缓存自动失效。对于 HQL 查询,如果参与查询的任何表对任何对象都有 INSERT/UPDATE/DELETE,则它只是清除所有缓存。

所以你可以试试Hibernate Dynamic SQL Cache项目,它旨在通过自动更新 SQL 查询缓存而不失效来解决这个问题。

PS“比尔蜥蜴”感谢您的理解:)

于 2012-06-04T16:44:51.700 回答