我有一个例外的代码:
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和一个新数据库添加了一个新用户,但这不应该影响这个。
答案 0 :(得分:5)
您将lookupPerson().children
传递给PostOrder
的构造函数 - 我假设这是与Person
映射的static hasMany = [ ... ]
类中的集合。所以Hibernate告诉你发生了什么 - 你使用了两次相同的集合。我觉得应该只有一个映射集合的所有者。请注意,这些不是常规的ArrayList
或HashSet
- 它们是Hibernate PersistentList
和PersistentSet
,它们实现了正确的接口但是特定于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 }