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);
Другие вопросы по тегам