Hibernate TransientObjectException для OneToMany с CascadeType.ALL, если мы вызываем iterator() перед сохранением
У меня есть отношение OneToMany в спящем режиме, как показано ниже:
class Container {
@OneToMany( cascade = {CascadeType.ALL}, mappedBy = "container", orphanRemoval = true)
List<Item> items;
}
упрощенный сценарий заключается в том, что я загружаю Container
объект (контейнер) из базы данных и попробуйте добавить Item
в container.items
как это:
Container container = entityManager.find(Container.class,id);
container.getItems().add(new Item(container));
entityManager.merge(container);
и все идет хорошо. Но в моем случае я хочу перебирать элементы и что-то проверять, но когда я просто звоню container.getItems().iterator
и сохранить container
как это:
Container container = entityManager.find(Container.class,id);
container.getItems().add(new Item(container));
container.getItems().iterator(); // here is the change
entityManager.merge(container); // here is where exception occured
Я получаю следующую ошибку
org.hibernate.TransientObjectException: объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр до сброса Query: mypackage.items
Я понятия не имею, почему происходит это исключение.
1 ответ
Ваш объект item должен иметь ссылку на своего родителя:
Container container = entityManager.find(Container.class,id);
Item item = new Item();
item.setContainer(container); //needed
container.getItems().add(item);