java.lang.IllegalArgumentException:删除分离的实例com.test.User#5 [英] java.lang.IllegalArgumentException: Removing a detached instance 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屋!