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() 未处理集合的主要内容,如果未能解决你的问题,请参考以下文章