EntityManager 的删除(对象实体)方法是否仅适用于从 find ()方法获取的对象?
我有以下代码段:
public void deletePerson() {
EntityManager em = getEntityManager();
Person p = new Person("x", "y", 200);
em.remove(p);
}
但它并没有从数据库中删除特定条目。
当我尝试以下内容时:
public void deletePerson() {
EntityManager em = getEntityManager();
Person p = em.find(Person.class, 200);
em.remove(p);
}
工作正常。
答案 0 :(得分:26)
在deleting JPA entity objects上的ObjectDB手册中引用:
为了从数据库中删除对象,必须先进行 检索(无论哪种方式),然后在活动事务中,它 可以使用remove方法删除。
如果参数不是,则抛出IllegalArgumentException 一个实体类的实例,或者它是一个分离的实体。
使用new
运算符创建对象时,它将成为一个分离的实体,如果要删除它,则需要保留它。
检索实体时,您正在检索持久性实体。
答案 1 :(得分:13)
向那个方向发展的东西。 EntityManager.remove仅适用于托管实体。您如何获得这些管理实体无关紧要,例如:
但是简单地创建新对象并尝试删除它不起作用,因为这个新对象不是托管实体。实体也不应该分离。
实体的生命如下,所有在同一交易中(交易之外的实体不受管理):
Entity ent = new Entity(1); //entity is in new state, EntityManager never know
//anything about it
em.persist(ent); //entity is managed as long as not disconnected
//from EntityManager
em.clear(); // all previously managed entities, including ent, are now detached
Entity same = em.find(1); //managed same
em.remove(same); // entity is removed
答案 2 :(得分:3)
如果是合并或删除操作,则必须使用find()操作,然后对检索到的实体使用remove方法。
答案 3 :(得分:0)
使用JPA
,您可以通过简单地执行delete
语句来删除实体而无需检索它:
javax.persistence.Query query = entityManager.createQuery("delete from A where id = :id");
query.setParameter("id", "value of id to delete");
int deletedRows = query.executeUpdate();