javax.persistence.Entitymanager:remove()方法

sac*_*ale 21 java persistence jpa

EntityManager的remove(Object entity)方法是否仅适用于从find()方法获得的那些对象?

我有以下代码片段:

public void deletePerson() {
    EntityManager em = getEntityManager();
    Person p = new Person("x", "y", 200);
    em.remove(p);
}
Run Code Online (Sandbox Code Playgroud)

但它并没有从数据库中删除特定条目.

当我尝试以下内容时:

public void deletePerson() {
    EntityManager em = getEntityManager();
    Person p = em.find(Person.class, 200);
    em.remove(p);
}
Run Code Online (Sandbox Code Playgroud)

它工作正常.

JMe*_*nik 26

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

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

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

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

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

  • 因此,您需要SELECT然后DELETE这两个查询,而您可以在单个本机DELETE中执行它.为什么说到JPA是多余的? (3认同)

Mik*_*unu 13

那个方向的东西.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
Run Code Online (Sandbox Code Playgroud)