【问题标题】:javax.persistence.Entitymanager: remove() methodjavax.persistence.Entitymanager: remove() 方法
【发布时间】:2012-07-17 09:23:00
【问题描述】:

EntityManagerremove(Object entity) 方法是否只对从 find() 方法获得的对象起作用?

我有以下代码 sn-p:

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

一切正常。

【问题讨论】:

    标签: java jpa persistence


    【解决方案1】:

    使用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();
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • JPA 中没有 findBy 操作 - 已编辑答案,等待审核
      【解决方案3】:

      朝着那个方向发展。 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
      

      【讨论】:

      • 感谢您的示例。现在我有了分离实体的想法。仍然认为它应该抛出一些异常说“实体不存在或某事”
      【解决方案4】:

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

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

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

      当使用new操作符创建对象时,它变成了一个分离的实体,如果你想删除它,你需要持久化它。

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

      【讨论】:

      • 鉴于上述陈述,em.remove(em.merge(person)) - 从数据库中检索到人员的位置 - 删除对象的正确方法吗?
      • @dendini 不,如果person已经从数据库中检索到,则表示它存在于数据库中。所以,在这种情况下,你可以直接调用em.remove(person)
      • 因此您需要先选择然后再删除,这是 2 个查询,而您可以在单个原生 DELETE 中执行此操作。为什么在 JPA 方面是多余的?
      • @sura2k 因为级联/关联实体(集合)可能不一致,可能会有所不同,并且删除不知道如何正确执行:stackoverflow.com/a/16089671/1915920
      猜你喜欢
      • 1970-01-01
      • 2018-10-16
      • 2012-08-21
      • 2014-03-16
      • 1970-01-01
      • 2020-06-05
      • 1970-01-01
      • 2015-05-02
      • 2013-02-13
      相关资源
      最近更新 更多