javax.persistence.Entitymanager:remove()方法
EntityManager的 remove (Object entity)方法是否仅适用于从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); }
它工作正常。
引用ObjectDB关于删除JPA实体对象的手册:
为了从数据库中删除对象,必须首先检索它(无论哪种方式),然后在活动事务中,可以使用remove方法删除它。
如果参数不是实体类的实例或者它是分离的实体,则由remove抛出IllegalArgumentException。
使用new
运算符创建对象时,它将成为一个分离的实体,如果要删除它,则需要保留它。
检索实体时,您正在检索持久性实体。
那个方向的东西。 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
如果是合并或删除操作,则必须使用find或findBy操作,然后对检索到的实体使用remove方法。