javax.persistence.Entitymanager:remove()方法

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

它工作正常。

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

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

如果参数不是实体类的实例或者它是分离的实体,则由remove抛出IllegalArgumentException。

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

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

那个方向的东西。 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 

如果是合并或删除操作,则必须使用find或findBy操作,然后对检索到的实体使用remove方法。