如果我保存一个包含以下列表的对象
@OneToMany(cascade=CascadeType.ALL, mappedBy="taskList")
@OrderColumn(name="position", nullable=false)
public List<Task> tasks = new ArrayList<Task>();
我得到异常
org.hibernate.HibernateException: Found two representations of same collection
Play!控制器看起来像这样:
TaskList taskList = taskList.findById(taskListId);
taskList.add(position, task);
taskList.save();
如果我在这个块之前插入taskList.refresh()
,它可以工作,但是位置信息丢失(这会导致其他错误)。
这是一个Hibernate bug还是我的代码有问题?
问题是,Hibernate不支持@OneToMany(mappedBy=...)
和@OrderColumn
的组合。如果没有mappedBy
, Hibernate使用连接表,一切都像预期的那样工作。看到的解释。
当您尝试修改对象的关联集合时,也会出现相同的错误。例如:
MyObject myObject = myObjectService.get(id);
List<Task> newTasks = //populate new list of Task here
myObject.setTasks(newTasks);
myObjectService.saveOrUpdateObject(myObject); // or merge(myObject)
在这种情况下,可以通过:
MyObject myObject = myObjectService.get(id);
List<Task> newTasks = //populate new list of Task here
myObject.setTasks(new List<Task>); // or myObject.getTasks().clear();
myObject.getTasks().addAll(newTasks);
myObjectService.merge(myObject);
我可以通过将关联更改为lazy
并删除级联来解决这个问题。
@OneToMany(mappedBy="taskList", fetch = FetchType.LAZY)
@OrderColumn(name="position", nullable=false)
public List<Task> tasks = new ArrayList<Task>();
如果您需要持久化列表,您可能需要用@OneToMany注释您的列表,以便能够持久化您的实体。
异常"org.hibernate "的另一个原因。
花了好几个小时才找到解决办法,我还是遇到了同样的问题。
我有一个EntityListener与此代码在我的Spring Boot应用程序
@PostLoad
public void defineRelation(EntityWithRelation entityWithRelation) {
entityWithRelation.setRelation(objectRelationBo
.findOneByObjectTypeAndReferenceId(entityWithRelation.getObject(), entityWithRelation.getId()));
}
这会在参与同一事务的其他不相关实体的随机(或看起来像)集合中导致异常。我不知道确切的原因,但添加@Transactional(propagation = Propagation.REQUIRES_NEW)
解决了这个问题
也许Hibernate不喜欢你手工修改实体,但是这个字段是一个瞬态字段…
问题是你的连接检查是否你没有捕捉任何数据,这不是在表