2009-11-09 49 views
12

我在Grails应用程序有一个集成测试,当我尝试保存类型的实体失败处理Member休眠/格姆:收集没有被冲洗()

invitingMember.save(flush: true) 

这就提出了以下异常

org.hibernate.AssertionFailure: 收集 [com.mycompany.facet.Facet.channels]是 不受冲洗()在 com.mycompany.member.MemberConnectionService.addOrUpdateContact(MemberC处理onnectionService.groovy:939)

在交易之前,我向invitingMember的集合属性添加一个对象。我的猜测是这个异常是在上面的行中引发的,因为只是在这一点上,添加到集合中的对象才会被持久化。

回答

6

潜在的问题可能是Hibernate没有级联保存。所以当你刷新Member时,Hibernate发现集合仍然很脏(这可能不是你想要的)。所以要么手动冲洗收集或tell Hibernate to cascade all the updates

+1

我非常肯定,当使用GORM(由Grails使用的,在“Hibernate之上”构建的ORM)保存级联默认情况下。 – 2009-11-09 15:59:34

1

我唯一遇到过这种怀疑的时候就是在使用Hibernate事件时, beforeInsert,beforeUpdate等 - 你使用这些?

有一个在JIRA与此相关的一个问题,这已得到修复Grails的1.2

+0

不,我没有使用任何事件 – 2009-11-09 23:03:29

3

我发现了一个可能的解决方案here

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

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

请不要犹豫编辑。

这是问题,我(在Java)

1

我有错误,当试图元素添加到集合后,删除集合元素。在向集合添加新元素之前,我通过调用save(flush:true)来解决此问题。

  • 在我的情况下,集合总是从select返回。