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

我在Grails应用程序中进行了集成测试,当我尝试保存Member类型的实体时失败

 invitingMember.save(flush: true) 

这引发了以下exception

org.hibernate.AssertionFailure:在com.mycompany.member.MemberConnectionService.addOrUpdateContact(MemberConnectionService.groovy:939)中,flush()未处理集合[com.mycompany.facet.Facet.channels]。

在事务的早期,我将一个对象添加到invitingMember的集合属性中。 我的猜测是exception是在上面的行中引发的,因为只有在这一点上才会保留添加到集合中的对象。

潜在的问题可能是Hibernate没有级联保存。 因此,当您刷新Member ,Hibernate会注意到该集合仍然很脏(这可能不是您想要的)。 因此要么手动刷新集合,要么告诉Hibernate级联所有更新 。

我在这里找到了可能的解决方案

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

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

不要犹豫,编辑。

这是我的问题(在java中)

我遇到该exception的唯一一次是在使用Hibernate事件时,例如beforeInsert,beforeUpdate等 – 您使用这些吗?

JIRA中存在与此相关的问题,已针对Grails 1.2进行了修复

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

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