如果我们在保存之前调用iterator(),则在OneToMany上使用CascadeType.ALL进行Hibernate TransientObjectException

时间:2018-01-08 06:30:36

标签: java hibernate one-to-many hibernate-cascade

我在hibernate中有OneToMany Relation,如下所示:

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:object引用未保存的瞬态实例 - 在查询刷新之前保存瞬态实例:mypackage.items

我不知道为什么会发生这种异常。

1 个答案:

答案 0 :(得分:2)

您的item对象需要引用其父对象:

Container container = entityManager.find(Container.class,id);
Item item = new Item();
item.setContainer(container); //needed
container.getItems().add(item);