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

我有一个 java EE 项目,使用 JPA (transaction-type = “ JTA”) ,hibernate 作为提供者。我写我的豆子来处理 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时,就会出现这个异常。

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

这是怎么引起的,我该怎么解决?

99271 次浏览

EntityManager#remove() 仅适用于在当前事务/上下文中管理的实体。在您的示例中,您在早期的事务中检索实体,将其存储在 HTTP 会话中,然后尝试在不同的事务/上下文中删除它。这样没用的。

您需要检查实体是否由 EntityManager#contains()管理,如果不是,那么让它管理它 EntityManager#merge()

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

em.remove(em.contains(entity) ? entity : em.merge(entity));

在我的例子中,当我试图删除一个对象时,我得到了相同的错误 使用,

session.delete(obj)

在此之前没有创建任何事务。

通过首先创建事务(session.starTransaction () ,然后删除对象,问题得到了解决。

我希望我的回答能帮到某人:)

我也面临同样的问题。应重新连接分离的实体。正如@BalusC 提到的,应该使用 EntityManager.merge()附加分离的实体。EntityManager.merge()生成 SQL Query,它获取实体的当前状态,必须在该状态上执行 EntityManager.remove()。但对我来说没用。 试试 EntityManager.remove(EntityManager.find(Class<T>,arg))吧,对我很有效。

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

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

  • 对象必须与实体管理器创建的会话在同一个会话中
  • 当实体管理器的会话仍然打开时,对象不能被传输到另一个对象。

干杯