Java 使用CascadeType.ALL在OneToMany上休眠TransientObject异常,如果在保存前调用迭代器()
我在hibernate中有一对夫妻关系,如下所示:Java 使用CascadeType.ALL在OneToMany上休眠TransientObject异常,如果在保存前调用迭代器(),java,hibernate,one-to-many,hibernate-cascade,Java,Hibernate,One To Many,Hibernate Cascade,我在hibernate中有一对夫妻关系,如下所示: class Container { @OneToMany( cascade = {CascadeType.ALL}, mappedBy = "container", orphanRemoval = true) List<Item> items; } 一切都很好。但是在我的例子中,我想迭代项目并检查一些东西,但是当我调用container.getItems().iterator并像这样保存container时: Co
class Container {
@OneToMany( cascade = {CascadeType.ALL}, mappedBy = "container", orphanRemoval = true)
List<Item> items;
}
一切都很好。但是在我的例子中,我想迭代项目并检查一些东西,但是当我调用container.getItems().iterator
并像这样保存container
时:
Container container = entityManager.find(Container.class,id);
container.getItems().add(new Item(container));
entityManager.merge(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.transientObject异常:对象引用未保存的临时实例-在查询刷新之前保存临时实例:mypackage.items
我不知道为什么会发生此异常。您的item对象需要有对其父对象的引用:
Container container = entityManager.find(Container.class,id);
Item item = new Item();
item.setContainer(container); //needed
container.getItems().add(item);
你能试着用listIterator代替iterator吗?@GarimaGupta不,同样的错误。如果在添加到列表之前将新项目
persist()
怎么办?@yegodm它可以工作,但是iterator()
有什么问题,我想用它来删除项目中的重复项。你的Hibernate版本是什么?我不能用5.2.12重现这个例子。不幸的是,我做到了。但是因为我简化了我的代码,我删除了它。有趣的是,只有当我调用iterator()
时,问题才会出现。否则,一切正常。当尝试使用具有分离状态的数据模型的域属性时,会发生此异常。您需要使用属性显式获取域对象,并使用session.load(yourTransientObject)进一步使用此获取的对象