我试图了解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)从db读入一些容器到内存(连同相应的项目)
String hql = "from Container c left join fetch c.items where c.type = 1"; List- list = hibernateTemplate.find(hql);
2)为所选容器插入新项目
hibernateTemplate.save(item)
3)重复第一步
然后在第3步中我看不到我在第二步中插入的项目.只有在插入新项目后手动清理缓存时才会看到它们:
sessionFactory.evictCollection("Container.items", updatedContainerId)
我的直觉告诉我,Hibernate应该自动执行这样的缓存失效.有没有人看到它的工作?我做错了什么还是不支持?
在此先感谢您的回答.问候汤姆
您可能会发现我的关于查询缓存工作的博客有助于理解查询缓存的作用以及它可能无法按您认为的方式工作的原因:
http://tech.puredanger.com/2009/07/10/hibernate-query-cache/