【问题标题】:Hibernate: detached of entities after commit()休眠:在提交()之后分离实体
【发布时间】:2016-11-23 10:07:16
【问题描述】:

我在代码中收到以下错误消息,尽管我从未手动调用 detach() 命令:

org.hibernate.PersistentObjectException: detached entity passed to persist: my.entity

我的实体使用

try
        {
                entityManager.getTransaction().begin(); 
                entityManager.persist(item);
                entityManager.getTransaction().commit(); 
        }
        catch(final Exception e)
        {
               entityManager.getTransaction().rollback();
               LOGGER.err("Error at persist.");
               throw new Exception();
        }

在文献中,我发现javax.persistence.EntityManager 自动分离close()EntityManager.getTransaction().commit() 和序列化上的实体。 (见here)。所以我假设每个item 在此操作后都会自动分离。对吗?

我怀疑这是我的问题的根本原因。我只想明确地触发detach() / merge()。是否可以更改设置以使EntityManager.getTransaction().commit() 不会导致detach()

【问题讨论】:

  • 我猜你需要在你不想受到父实体更改影响的实体中添加 cascateType=DETACH
  • 我认为对 EntityManager.getTransaction().commit() 进行一些更改以隐藏问题并不是一个好主意,正确回滚需要分离。顺便说一句,您是否尝试过 saveOrUpdate 以防持久化?
  • @Cralfaro:也许我还不够熟悉。我的问题是实体是分离的,尽管我从未在我的代码中明确调用过detach()。所以我有太多(而不是更少)不需要的分离实体。
  • @Parshant:我的目标不是更改EntityManager.getTransaction().commit()的源代码。但也许有一些可访问的选项来控制行为。我将编辑我的问题并尝试使其更清晰。

标签: java hibernate detach


【解决方案1】:

实体仅在您关闭或清除事务时才分离,而不是在您提交时?! ..

Detach

以下操作清空整个EntityManager的 持久化上下文并分离所有托管实体对象:

*调用close方法,关闭一个EntityManager。

*调用 clear 方法,清除 EntityManager 的 持久化上下文。

*回滚事务 - 通过调用 回滚或提交失败。

【讨论】:

  • 感谢 Sagar,似乎我将文档从“提交失败”解释为“每次提交”。我会在saveOrUpdate()进行更多调查
  • 可以解决我的问题。从@ManyToOne(cascade=CascadeType.PERSIST) 中删除参数会使错误消失。无论如何,我会更详细地调查,为什么实体被分离。
猜你喜欢
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-17
  • 2018-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多