EntityManager的remove(对象实体)方法只对那些从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);
}
工作正常。
删除JPA实体对象:
为了从数据库中删除对象,必须首先 检索(无论哪种方式),然后在活动事务中,它 可以使用remove方法删除。当使用如果参数不存在,remove 会抛出 IllegalArgumentException a 实体类的实例,或者它是分离的实体。
new
操作符创建对象时,它就变成了一个分离的实体,如果你想删除它,你需要持久化它。当检索实体时,您正在检索持久实体。
EntityManager.remove 仅适用于托管实体。您如何获得这些托管实体并不重要,例如可以是:
实体的生命周期如下,全部在同一个事务中(事务之外的实体不受管理):
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
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();