java.lang.IllegalArgumentException:删除分离的实例com.test.User#5 [英] java.lang.IllegalArgumentException: Removing a detached instance com.test.User#5

查看:127
本文介绍了java.lang.IllegalArgumentException:删除分离的实例com.test.User#5的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个使用JPA(transaction-type ="JTA")的Java EE项目,已休眠为提供程序.我写我的豆子来处理CRUD的事情.该程序在JBOSS 7 AS中运行.

I have a java EE project using JPA (transaction-type="JTA"), hibernate as provider. I write my beans to handle the CRUD things. The program running in JBOSS 7 AS.

我有一个EntityManagerDAO:

I have an 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时,会出现此异常.

but when I invoke deleteObject, this exception comes out.

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

java.lang.IllegalArgumentException: Removing a detached instance com.test.User#5

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

How is this caused and how can I solve it?

推荐答案

EntityManager#remove() works only on entities which are managed in the current transaction/context. In your case, you're retrieving the entity in an earlier transaction, storing it in the HTTP session and then attempting to remove it in a different transaction/context. This just won't work.

您需要检查实体是否由 EntityManager#merge() .

You need to check if the entity is managed by EntityManager#contains() and if not, then make it managed it EntityManager#merge().

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

Basically, the delete() method of your business service class should look like this:

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

这篇关于java.lang.IllegalArgumentException:删除分离的实例com.test.User#5的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆