【问题标题】:Hibernate TransientObjectException on OneToMany with CascadeType.ALL if we call iterator() before save如果我们在保存之前调用 iterator(),则使用 CascadeType.ALL 在 OneToMany 上休眠 TransientObjectException
【发布时间】:2018-06-17 03:16:27
【问题描述】:

我在休眠中有 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: 对象引用了一个未保存的瞬态实例 - 在查询刷新之前保存瞬态实例:mypackage.items

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

【问题讨论】:

  • 你可以试试用 listIterator 代替 iterator 吗?
  • @GarimaGupta 不,同样的错误。
  • 如果您在添加到列表之前persist() 新项目会怎样?
  • @yegodm 可以,但是iterator() 出了什么问题,我想用它来删除项目中的重复项。
  • 你的 Hibernate 版本是多少?我无法用 5.2.12 重现该案例。

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


【解决方案1】:

您的项目对象需要有对其父对象的引用:

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

【讨论】:

  • 不幸的是,我做到了。但是因为我简化了我的代码,所以我删除了它。有趣的是,只有当我调用iterator() 时才会出现问题。否则,一切都很好。
  • 当尝试将 Domain 属性与具有分离状态的数据模型一起使用时会发生此异常。您需要使用该属性显式获取域对象,并使用 session.load(yourTransientObject) 进一步使用此获取的对象
猜你喜欢
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
  • 2011-10-31
  • 2015-07-07
  • 2013-03-24
  • 2018-07-11
  • 1970-01-01
  • 2021-09-22
相关资源
最近更新 更多