HibernateException:找到同一集合的两个表示

时间:2011-11-29 22:31:47

标签: java hibernate jpa playframework

如果我保存包含以下列表的对象

@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错误还是我的代码有问题?

7 个答案:

答案 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)

问题在于你的加入检查你是否没有提取表格中没有的任何数据