68

我有一个使用 JPA (transaction-type="JTA")、hibernate 作为提供者的 java EE 项目。我写我的 bean 来处理 CRUD 的事情。在JBOSS 7 AS 中运行的程序。

我有一个 EntityManagerDAO :

@Stateful
public class EntityManagerDao implements Serializable {

    @PersistenceContext(unitName = "dtdJpa")
    private EntityManager entityManager;

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public Object updateObject(Object object) {
        object = entityManager.merge(object);
        return object;
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void createObject(Object object) {
        entityManager.persist(object);
    }

    public void refresh(Object object) {
        entityManager.refresh(object);
    }

    public <T> T find(Class<T> clazz, Long id) {
        return entityManager.find(clazz, id);
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void deleteObject(Object object) {
        entityManager.remove(object);
    }
}

但是当我调用时deleteObject,会出现此异常。

java.lang.IllegalArgumentException:删除分离的实例 com.test.User#5

这是如何引起的,我该如何解决?

4

5 回答 5

229

EntityManager#remove()仅适用于在当前事务/上下文中管理的实体。在您的情况下,您在较早的事务中检索实体,将其存储在 HTTP 会话中,然后尝试在不同的事务/上下文中将其删除。这只是行不通。

您需要检查实体是否由管理EntityManager#contains(),如果不是,则使其管理它EntityManager#merge()

基本上,delete()您的业务服务类的方法应如下所示:

em.remove(em.contains(entity) ? entity : em.merge(entity));
于 2013-06-10T15:33:27.077 回答
3

就我而言,当我尝试使用删除对象时,我遇到了同样的错误,

session.delete(obj)

在此之前没有创建任何交易。

问题是通过先创建事务(session.beginTransaction() 然后删除对象来解决的。

我希望我的回答对某人有所帮助:)

于 2016-06-18T16:34:27.200 回答
1

有时这仅仅是因为您缺少用于添加、删除、更新操作的 @Transaction 注释。

于 2018-03-27T21:11:08.353 回答
0

我遇到了同样的问题。应重新连接分离的实体。正如@BalusC 提到的,EntityManager.merge()应该使用 using 来附加分离的实体。EntityManager.merge()生成 SQL 查询,该查询获取EntityManager.remove()必须执行的实体的当前状态。但就我而言,它没有用。试试EntityManager.remove(EntityManager.find(Class<T>,arg))吧。它对我有用。

于 2017-04-15T20:34:31.967 回答
-1

以我的经验,如果我从数据库中查询一个对象,然后关闭实体管理器,然后执行数据库删除,就会出现问题。或者,如果我将该加载的对象复制到另一个实例然后执行删除,也会发生此问题。在我看来,有两点需要注意:

  • 该对象必须在由实体管理器创建的同一会话中
  • 并且在实体管理器的会话仍处于打开状态时,不得将对象转移到另一个对象。

干杯

于 2018-12-10T20:19:29.373 回答