0

下面的代码行有一个例外:

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

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

完整的例外是:

  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 和一个新数据库添加了一个新用户,但这不应该影响这个。

4

1 回答 1

5

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

如果要将集合项传递给 new 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 }
于 2013-02-06T23:58:13.100 回答