找到了grails中集合异常的共享引用

Sag*_*ael 0 grails grails-orm

我对以下代码行有一个例外:

  def order = new PostOrder(pOrder: "post", posts: status, children: lookupPerson().children)
Run Code Online (Sandbox Code Playgroud)

lookupPerson().children给出了一组具有不同id的2个Child实例

完整的例外是:

  org.hibernate.HibernateException: Found shared references to a collection: com.fyp.timeline.PostOrder.children
at com.fyp.timeline.ProfileController$$ENwi3LDE.updateStatus(ProfileController.groovy:134)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:680)
Run Code Online (Sandbox Code Playgroud)

我真的很困惑.主要是因为它曾经常常工作并随机停止.我已经为MySql和一个新数据库添加了一个新用户,但这不应该影响这个.

Bur*_*ith 5

你传递lookupPerson().children给的构造函数PostOrder- 我假设这是Person映射的类中的集合static hasMany = [ ... ].所以Hibernate告诉你发生了什么 - 你使用了两次相同的集合.我觉得应该只有一个映射集合的所有者.请记住,这些不是常规ArrayList的或HashSets - 它们是Hibernate PersistentListPersistentSets,它们实现了正确的接口但是特定于Hibernate.

如果要将集合项目传递PostOrder给新集合,可以将它们复制到新集合中,例如

def order = new PostOrder(
    pOrder: "post", posts: status,
    children: [] + lookupPerson().children)
Run Code Online (Sandbox Code Playgroud)

但是,由于这可能也是一个映射集合,您应该使用addToChildren,例如

def order = new PostOrder(pOrder: "post", posts: status)
lookupPerson().children.each { order.addToChildren it }
Run Code Online (Sandbox Code Playgroud)