【问题标题】:Hibernate: Clean collection's 2nd level cache while cascade delete items休眠:在级联删除项目时清理集合的二级缓存
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 我这里没有使用 on-delete="cascade"(即数据库级级联),而是使用 cascade="delete"(即休眠必须递归调用“delete”,不应该) t 它?)关于“冲洗”。我确实在最后提交,它不会强制刷新吗?
  • 你看到 Hibernate 在日志中有很多删除问题吗?
  • 但是hibernate可以知道实体是否会被级联删除。
  • 我仍在等待确认他使用了正确的设置并且实际上看到 Hibernate 发出 DELETE 语句。如果他这样做了,那么他可能需要刷新 Humans 实例,因为它已经过时了。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-07-05
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 2012-10-12
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多