java - Hibernate:在级联删除项目时清理集合的二级缓存

标签 java hibernate caching cascade second-level-cache

我有一个问题,Hibernate 不会为级联删除的项目集合更新二级缓存。

详情

假设我们有一个对象 Parent,其中包含 Child 对象的 Parent.myChildren 集合。 现在我们还有对象 Humans 和 Humans.myAllHumans 集合,所有父对象和子对象都在该集合中。
现在我们 session.delete(parent) 并且所有的 child 都从数据库中级联删除,但是 Humans.myAllHumans 集合的缓存没有更新!它仍然假设级联删除的对象在数据库中,并且我们在稍后尝试迭代集合时遇到以下异常:
org.hibernate.ObjectNotFoundException:不存在具有给定标识符的行:[foo.Child#751]

尝试过的方法

1) 我已经尝试过 SessionFactory.evictCollection() 方法,但据我所知,它不是事务安全的并且很难从二级缓存中删除数据,我不希望那样。

2) 我还可以手动(以编程方式)从 myAllHumans 集合中删除每个对象。在这种情况下,hibernate 会更新二级缓存。我想避免这种方法,因为它只会使级联删除功能变得无用。

预计

我希望 hibernate 足够智能以自动更新集合的缓存。可能吗?
我现在正在使用 EhCache,您认为使用其他缓存实现或配置 EhCache 可能有帮助吗?

最佳答案

问题是 Hibernate 实际上并不执行删除操作。数据库作为外键关系的一部分执行此操作,因此 Hibernate 永远不会看到所有可能被删除的对象,因此,无法更新适用于每种情况的缓存。

我认为最好的办法是在删除时刷新缓存(或其中的一部分)。

关于java - Hibernate:在级联删除项目时清理集合的二级缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1470502/

相关文章:

eclipse - 有没有办法在 netbeans/eclipse 中自动生成 hibernate.cfg.xml 文件?

java - Hibernate 不包括与另一个实体列表中的实体类型相同的子实体

c# - 如何阻止浏览器(尤其是Internet Explorer)进行JavaScript的 super 缓存?

java - 停止循环 GIF 图标

java - 通过intent(Parcelable)传递自定义对象返回null

mysql - Hibernate 和 MySql 的 Hikaricp : one of either dataSource or dataSourceClassName must be specified

php - 我应该在 php 中缓存整个查询还是应该只缓存行的主键?

objective-c - 为什么 NSURLSession 不使用我配置的 NSURLCache?

java - 如何包装 ConcurrentSkipListSet 以线程安全的方式保持最新值的固定容量?

java - Android 服务连接泄露