如果我保存包含以下列表的对象
@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错误还是我的代码有问题?
答案 0 :(得分:11)
问题是,Hibernate不支持@OneToMany(mappedBy=...)
和@OrderColumn
的组合。没有mappedBy
Hibernate使用连接表,一切都按预期工作。见explanation。
答案 1 :(得分:1)
我可以通过将关联更改为lazy
并删除级联来解决此问题。
@OneToMany(mappedBy="taskList", fetch = FetchType.LAZY)
@OrderColumn(name="position", nullable=false)
public List<Task> tasks = new ArrayList<Task>();
答案 2 :(得分:0)
如果您需要保留列表,则可能需要使用@OneToMany为您的列表添加注释,以便能够保留您的实体。
答案 3 :(得分:0)
异常“org.hibernate.HibernateException:发现两个相同集合的表示”的另一个原因是实体中重复的getter / setter。
答案 4 :(得分:0)
当您尝试修改对象的关联集合时,会发生同样的错误。 e.g:
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);
答案 5 :(得分:0)
几个小时后,我找到了解决方案,但我遇到了同样的问题。
我的Spring Boot应用程序中有一个带有此代码的EntityListener
@PostLoad
public void defineRelation(EntityWithRelation entityWithRelation) {
entityWithRelation.setRelation(objectRelationBo
.findOneByObjectTypeAndReferenceId(entityWithRelation.getObject(), entityWithRelation.getId()));
}
这在参与同一事务的其他不相关实体的随机(或类似)集合中导致异常。我不知道确切的原因,但是添加@Transactional(propagation = Propagation.REQUIRES_NEW)
可以解决问题
也许Hibernate不喜欢您手动修改实体,但是该字段是一个临时字段...
答案 6 :(得分:-1)
问题在于你的加入检查你是否没有提取表格中没有的任何数据