找到对集合 org.hibernate.HibernateException 的共享引用

2022-08-31 13:06:44

我收到此错误消息:

错误:找到对集合的共享引用:Person.relatedPersons

当我尝试执行时:addToRelatedPersons(anotherPerson)

person.addToRelatedPersons(anotherPerson);
anotherPerson.addToRelatedPersons(person);

anotherPerson.save();
person.save();

我的域名:

Person {

 static hasMany = [relatedPersons:Person];

}

任何想法为什么会发生这种情况?


答案 1

当您尝试保留共享一集合引用的多个实体实例(即集合标识与集合相等性相反)时,Hibernate 会显示此错误。

请注意,它表示相同的集合,而不是集合元素 - 换句话说,在两者上,并且必须相同。也许您正在加载实体后重置该集合?或者您已经使用相同的集合实例初始化了两个引用?relatedPersonspersonanotherPerson


答案 2

我遇到了同样的问题。在我的情况下,问题是有人使用BeanUtils将一个实体的属性复制到另一个实体,所以我们最终有两个实体引用了同一个集合。

鉴于我花了一些时间调查此问题,我建议使用以下清单:

  • 查找类似情况并返回对集合的内部引用(如果 getCollection() 返回集合的新实例,则无需担心)。entity1.setCollection(entity2.getCollection())getCollection

  • 查看是否已正确实现。clone()

  • 查找。BeanUtils.copyProperties(entity1, entity2)


推荐