Hibernate/GORM:flush() 未处理集合

Posted

技术标签:

【中文标题】Hibernate/GORM:flush() 未处理集合【英文标题】:Hibernate/GORM: collection was not processed by flush() 【发布时间】:2010-12-14 16:02:48 【问题描述】:

当我尝试保存 Member 类型的实体时,我的 Grails 应用程序中有一个集成测试失败

invitingMember.save(flush: true)

这会引发以下异常

org.hibernate.AssertionFailure: 收藏 [com.mycompany.facet.Facet.channels] 是 未由 flush() 处理 com.mycompany.member.MemberConnectionService.addOrUpdateContact(MemberConnectionService.groovy:939)

在事务的早期,我将一个对象添加到invitingMember 的集合属性中。我的猜测是上面一行抛出了异常,因为只有在这一点上,添加到集合中的对象才会被持久化。

【问题讨论】:

【参考方案1】:

潜在的问题可能是 Hibernate 没有级联保存。因此,当您刷新Member 时,Hibernate 会注意到该集合仍然是脏的(这可能不是您想要的)。所以要么手动刷新集合,要么tell Hibernate to cascade all the updates。

【讨论】:

我很确定,当使用 GORM(Grails 使用的构建在 Hibernate 之上的 ORM)时,默认情况下会级联。【参考方案2】:

我找到了一个可能的解决方案here。

实际上,查看 toString、equals、hashcode 并确保您没有访问您的惰性访问器。

我知道我在谈论 java,这里的问题是关于 grails,但也许 grails 也有同样的事情。

不要犹豫编辑。

这对我来说是个问题(在 java 中)

【讨论】:

【参考方案3】:

我遇到的唯一一次异常是在使用 Hibernate 事件时,例如beforeInsert、beforeUpdate 等 - 你在使用这些吗?

JIRA 中存在与此相关的问题,已在 Grails 1.2 中修复

【讨论】:

【参考方案4】:

在从集合中删除元素后尝试将元素添加到集合时,我遇到了该错误。在向集合添加新元素之前,我通过调用 save(flush:true) 解决了这个问题。

就我而言,集合总是从select 返回。

【讨论】:

以上是关于Hibernate/GORM:flush() 未处理集合的主要内容,如果未能解决你的问题,请参考以下文章

PHP 缓冲区 ob_flush() 与 flush()

php ob_flush 和flush

SOCKET,write,flush出去的数据怎么接收?

file.flush() 到底在做啥?

io中需要flush()刷新的流

Azure App Insights 中的 Flush()