javax.persistence.Entitymanager:remove()方法

时间:2012-07-18 10:54:17

标签: java jpa persistence

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

工作正常。

4 个答案:

答案 0 :(得分:26)

deleting JPA entity objects上的ObjectDB手册中引用:

  

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

     

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

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

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

答案 1 :(得分: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

答案 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();