javax.persistence.Entitymanager:remove()方法

问题描述 投票:0回答:4

EntityManagerremove(对象实体)方法只对那些从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); }

工作正常。

java jpa persistence
4个回答
26
投票
引用ObjectDB手册关于

删除JPA实体对象

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

如果参数不存在,remove 会抛出 IllegalArgumentException a 实体类的实例,或者它是分离的实体。

当使用

new

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

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


14
投票
朝着那个方向的东西。

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
    

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


3
投票
使用

JPA

,您可以通过简单地执行 
delete
 语句来删除实体而不检索它:

// em is your instance of EntityManager javax.persistence.Query q = em.createQuery("delete from A where id = :id"); q.setParameter("id", "value of id to delete"); int deletedRows = q.executeUpdate();
    
© www.soinside.com 2019 - 2024. All rights reserved.