我试图了解休眠查询缓存的真正工作原理。我现在看到的是,当我将新实体插入数据库时,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 应该自动执行这样的缓存失效。有没有人看到它工作?我做错了什么还是不支持?
提前感谢您的回答。问候汤姆