9

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

细节

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

尝试的方法

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

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

预期的

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

4

3 回答 3

1

我一直在努力解决需要从缓存中删除集合的其他问题,并且我已经制定了一些解决方案。我不知道是否可以在级联删除时自动更新集合的缓存,但如果您尝试过 SessionFactory.evictCollection() 并且它有效,我认为这个解决方案可以是事务安全的并且它也有效:

if (MYCOLLECTION instanceof AbstractPersistentCollection) ((AbstractPersistentCollection) MYCOLLECTION).dirty();

于 2010-05-19T21:35:25.253 回答
1

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

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

于 2009-09-24T10:56:40.210 回答
0

通常 Hibernate 需要对对象进行政治上不正确的刷新才能重新加载缓存。

重要的是 EhCache 如何处理惰性属性。我发现集合的lazy属性没有设置,cahe没有刷新对象。

在您的情况下,如果 Humans 属性的 Humans 设置设置为 lazy = true (默认选项),则 ehcache 不会在对象时刷新它。尝试将human 和children 集合的lazy 属性设置为false。

于 2009-12-03T19:39:05.567 回答