Hibernate:清除集合的二级缓存,同时级联删除项目

时间:2009-09-24 08:57:48

标签: java hibernate caching cascade second-level-cache

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

详细信息

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

尝试了方法

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

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

预期

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

通常Hibernate需要在政治上不正确地刷新对象才能重新加载cahe。

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

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

相关问题