尝试删除实体时,必须管理实体才能调用remove。

7

我有一个删除列表中所选实体的方法。但是在调用时会生成此错误,我无法理解出错原因。

java.lang.IllegalArgumentException: 必须先使实体处于托管状态才能调用 remove 方法:HP Envy 15,请尝试合并已分离的实体,然后再次执行 remove。

public void delete(Stock stock){
        EntityManager em = ConnectionFactory.createEntityManager();
        em.getTransaction().begin();
        em.detach(stock);
        em.remove(stock);
        em.getTransaction().commit();        
        em.close();
    }

我已经阅读了其他相关帖子。

实体必须处于托管状态才能调用remove方法

IllegalArgumentException: 实体必须处于托管状态才能调用remove方法

5个回答

20

如果实体未附加,则无法删除该实体。如果实体仍然附加,您可以按原样删除它。如果它不再附加,则可以使用merge重新附加它:

if (!em.contains(stock)) {
    stock = em.merge(stock);
}

em.remove(stock);

1
谢谢,我没有看到em.deach行(股票)按照建议更改了代码,它可以工作了。 - Ivan Vilanculo

4

非常感谢大家,你们帮助我解决了头痛的问题。以下是修正错误后的代码:


EntityManager em = ConnectionFactory.createEntityManager();
em.getTransaction().begin();
if (!em.contains(stock)) {
    current = em.merge(stock);
}
em.remove(current);
em.getTransaction().commit();
em.close();

2
为什么要分离对象?如果参数不是实体对象,则分离方法会抛出IllegalArgumentException异常。如果参数“stock”由实体管理器管理,则删除分离行;否则,请合并该实体。
请尝试以下操作:
public void delete(Stock stock){
        EntityManager em = ConnectionFactory.createEntityManager();
        em.getTransaction().begin();
        Stock mStock2 = em.merge(stock);
        em.remove(mStock2);
        em.getTransaction().commit();        
        em.close();
    }

2

你将一个实体从会话中分离,然后删除它。这样做是行不通的。

尝试删除em.detach(stock);并传递一些实体到该方法中,这些实体保证已经附加到会话中,即从数据库中获取某些内容,然后立即删除它。如果这样做可以,则说明你正在错误地使用该方法,很可能是使用分离的或刚创建的实体。


2

移除

em.detach(stock);

detach会将你的实体从entityManager中移除


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接