22

EntityManager的remove (Object entity) 方法是否仅适用于从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);
}

它工作正常。

4

4 回答 4

26

引用 ObjectDB 关于删除 JPA 实体对象的手册:

为了从数据库中删除一个对象,必须首先检索它(无论哪种方式),然后在活动事务中,可以使用 remove 方法将其删除。

如果参数不是实体类的实例或者它是分离的实体,则 remove 会引发 IllegalArgumentException。

使用new运算符创建对象时,它成为一个分离的实体,如果要删除它,则需要将其持久化。

检索实体时,您正在检索持久实体。

于 2012-07-18T10:59:41.013 回答
14

那个方向的东西。EntityManager.remove仅适用于托管实体。您如何获得这些托管实体并不重要,例如:

  • 通过 JPQL 查询
  • 通过 Criteria API 查询
  • 在 EntityManager 中查找方法
  • 通过遵循来自其他实体的关系。
  • 创建新实体并将其持久化

但是简单地创建新对象并尝试删除它是行不通的,因为这个新对象不是托管实体。实体也不应该被分离。

实体的寿命大致如下,都在同一个事务中(事务之外的实体不受管理):

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
于 2012-07-18T10:59:04.893 回答
3

是的,在合并或删除操作的情况下,您必须使用 find() 操作,然后在检索到的实体上使用 remove 方法。

于 2012-07-18T11:06:07.190 回答
2

使用,您可以通过简单地执行语句JPA来删除实体而不检索它:delete

javax.persistence.Query q= entityManager.createQuery("delete from A where id = :id");
q.setParameter("id", "value of id to delete");
int deletedRows = q.executeUpdate();
于 2019-12-30T14:29:38.227 回答