【问题标题】:Hibernate/GORM: collection was not processed by flush()Hibernate/GORM: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 的集合属性中。我的猜测是上面一行抛出了异常,因为只有在这一点上,添加到集合中的对象才会被持久化。

【问题讨论】:

    标签: java hibernate grails grails-orm


    【解决方案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 返回。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-07
          • 1970-01-01
          • 1970-01-01
          • 2013-07-23
          • 1970-01-01
          • 2019-08-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多