javax.persistence.Entitymanager: remove() method

2022-09-02 00:47:02

EntityManagerremove(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);
}

它工作正常。


答案 1

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

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

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

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

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


答案 2

朝着这个方向发展。EntityManager.remove 仅适用于托管实体。如何获取这些托管实体并不重要,例如:

  • 通过 JPQL 查询
  • 通过条件 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

推荐