发现同一个集合的两个表示



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

@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不喜欢你手工修改实体,但是这个字段是一个瞬态字段…

问题是你的连接检查是否你没有捕捉任何数据,这不是在表

最新更新