【发布时间】:2010-12-01 00:39:28
【问题描述】:
我有一个问题,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 会有所帮助吗?
【问题讨论】:
-
我想我的问题案例可以简化。假设我只调用“session.delete(child)”,如何确定 Parent.myChildren 二级缓存已同步?
-
如果它显示
No row with the given identifier exists,则表明它是查询缓存未更新...您使用的是查询缓存,还是只是普通的二级缓存? -
看看同样的问题问题:stackoverflow.com/questions/3087040/…
标签: java hibernate caching cascade second-level-cache