HibernateException: Found two representations of same collection

31,373

Solution 1

The problem was, that Hibernate does not support the combination of @OneToMany(mappedBy=...) and @OrderColumn. Without mappedBy Hibernate uses a join table and everything works as expected. See explanation.

Solution 2

The same error occurs when you try to modify an associated collection of an object. 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)      

In such a case, it can be resolved by:

    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); 

Solution 3

I could resolve the issue by changing the association to lazy and removing the cascade.

@OneToMany(mappedBy="taskList", fetch = FetchType.LAZY)
@OrderColumn(name="position", nullable=false)
public List<Task> tasks = new ArrayList<Task>();
Share:
31,373
deamon
Author by

deamon

Updated on September 30, 2020

Comments

  • deamon
    deamon over 3 years

    If I save an object containing the following list

    @OneToMany(cascade=CascadeType.ALL, mappedBy="taskList")
    @OrderColumn(name="position", nullable=false)
    public List<Task> tasks = new ArrayList<Task>();
    

    I get the exception

    org.hibernate.HibernateException: Found two representations of same collection
    

    The code in the Play! controller looks like this:

    TaskList taskList = taskList.findById(taskListId);
    taskList.add(position, task);
    taskList.save();
    

    If I insert taskList.refresh() before this block it works, but the position information is lost (which leads to other errors).

    Is this a Hibernate bug or is something wrong with my code?

  • deamon
    deamon over 12 years
    You are right. I left out this annotation to shorten my example - probably a bad idea.
  • Ruben Vervaeke
    Ruben Vervaeke over 3 years
    Removing FetchType.EAGER worked for while retaining the CascadeType.ALL operation.