我有这个方法来删除列表中选择的实体。但是当被调用时会产生这个错误,我看不出原因。
java.lang.IllegalArgumentException:必须管理实体才能调用 删除:HP Envy 15,尝试合并分离并再次尝试删除。
public void delete(Stock stock){
EntityManager em = ConnectionFactory.createEntityManager();
em.getTransaction().begin();
em.detach(stock);
em.remove(stock);
em.getTransaction().commit();
em.close();
}
我已阅读其他相关帖子
Entity must be managed to call remove
IllegalArgumentException: Entity must be managed to call remove
答案 0 :(得分:11)
如果未附加实体,则无法将其删除。如果实体仍然附加,您可以按原样删除它。如果不再附加,则可以使用merge
重新附加它:
if (!em.contains(stock)) {
stock = em.merge(stock);
}
em.remove(stock);
答案 1 :(得分:2)
您从会话中分离实体,然后将其删除。那不会起作用。
尝试删除em.detach(stock);
并将一些实体传递给保证附加到会话的方法,即从DB中获取内容然后立即删除它。如果可行,那么您正在以错误的方式使用您的方法,很可能是使用分离的或刚刚创建的实体。
答案 2 :(得分:2)
删除
em.detach(stock);
detach将您的实体从entityManager
中删除答案 3 :(得分:2)
为什么要分离物体?如果参数不是实体对象,则抛出IllegalArgumentException。 如果参数库存由实体管理器管理,则删除分离行,否则合并实体。
试试这个:
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();
}
答案 4 :(得分:2)
非常感谢你们 你帮我治好了头疼 这是纠正错误后的代码
EntityManager em = ConnectionFactory.createEntityManager();
em.getTransaction().begin();
if (!em.contains(stock)) {
current = em.merge(stock);
}
em.remove(current);
em.getTransaction().commit();
em.close();