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

nep*_*une 51 jpa entitymanager illegalargumentexception sql-delete

我有一个使用JPA(transaction-type ="JTA")的java EE项目,hibernate作为提供者.我写我的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我调用时deleteObject,会出现这个异常.

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

这是怎么造成的,我该如何解决?

Bal*_*usC 195

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

您需要检查实体是否由管理EntityManager#contains(),如果没有,则进行管理EntityManager#merge().

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

em.remove(em.contains(entity) ? entity : em.merge(entity));
Run Code Online (Sandbox Code Playgroud)

  • @BalusC将`em.remove(em.getReference(...))`也工作? (3认同)
  • 先生打得好。这是真的,这是一个很好的解决方案。 (2认同)