【发布时间】: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()的源代码。但也许有一些可访问的选项来控制行为。我将编辑我的问题并尝试使其更清晰。