HibernateException: найдено два представления одной коллекции
если я сохраню объект, содержащий следующий список
@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
код в игру! контроллер выглядит так:
TaskList taskList = taskList.findById(taskListId);
taskList.add(position, task);
taskList.save();
если я вставляю taskList.refresh()
перед этим блоком он работает, но информация о позиции теряется (что приводит к другим ошибкам).
это ошибка, Hibernate или что-то не так с моим кодом?
5 ответов
проблема была в том, что Hibernate не поддерживает комбинацию @OneToMany(mappedBy=...)
и @OrderColumn
. Без mappedBy
Hibernate использует таблицу соединений, и все работает так, как ожидалось. См.объяснение.
Если вам нужно, чтобы список сохранялся, вам может потребоваться аннотировать свой список с помощью @OneToMany, чтобы сохранить вашу сущность.
еще одна причина исключения " org.зимовать.HibernateException: найдено два представления одной и той же коллекции" дублируются геттеры/сеттеры в сущности.
та же ошибка возникает при попытке изменить связанную коллекцию объекта. например:
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);