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

时间:2013-02-06 23:21:38

标签: grails gorm

我有一个例外的代码:

  def order = new PostOrder(pOrder: "post", posts: status, children: lookupPerson().children)

lookupPerson()。children提供了一组具有不同id

的2个子实例

完整的例外是:

  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)

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

1 个答案:

答案 0 :(得分:5)

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

如果您想将收集项​​目传递给新的PostOrder,您可以将它们复制到新的收藏中,例如

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

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

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