2012-07-18 24 views
20

¿Se eliminar (entidad Objeto) Método de EntityManager trabajo sólo en aquellos objetos consiguieron de encontrar el método()?javax.persistence.EntityManager: eliminar() método

Tengo siguiente fragmento de código:

public void deletePerson() { 
    EntityManager em = getEntityManager(); 
    Person p = new Person("x", "y", 200); 
    em.remove(p); 
} 

Pero no es la eliminación de la entrada en particular a partir de la base de datos.

Cuando intenté algo parecido a continuación:

public void deletePerson() { 
    EntityManager em = getEntityManager(); 
    Person p = em.find(Person.class, 200); 
    em.remove(p); 
} 

Está funcionando bien.

Respuesta

24

Citando el manual del ObjectDB en deleting JPA entity objects:

Con el fin de eliminar un objeto de la base de datos tiene que ser primero recuperado (no importa la forma) y luego en una transacción activa, se se puede eliminar usando el método remove.

IllegalArgumentException es lanzada por remove si el argumento no es a una instancia de una clase de entidad o si se trata de una entidad separada.

Al crear un objeto con el operador new, se convierte en una entidad separada, necesita persistir si desea eliminarlo.

Al recuperar entidad, va a recuperar entidad persistente.

+0

Teniendo en cuenta la declaración anterior, es em.remove (em.merge (persona)) - donde la persona se ha recuperado de la base de datos - una forma correcta de eliminar el objeto ? – dendini

+0

@dendini No, si 'persona' se ha recuperado de la base de datos, entonces significa que existe en la base de datos. Entonces, en este caso, puede llamar directamente 'em.remove (persona)'. –

+3

Por lo tanto, necesita SELECCIONAR y ELIMINAR, que son 2 consultas, mientras que puede hacerlo en un único DELETE nativo. ¿Por qué redundante cuando se trata de JPA? – sura2k

13

Algo de esa dirección. EntityManager.remove funciona solo para entidades administradas. Cómo obtuvo estas entidades gestionadas no importa, que puede ser por ejemplo:

  • través JPQL consulta
  • mediante criterios de consulta de la API
  • método de búsqueda en EntityManager
  • siguiendo relación de alguna otra entidad.
  • creados nueva entidad y persistieron que

Pero la simple creación de nuevos objetos y tratar de eliminar no funciona, ya que este nuevo objeto no se gestiona entidad. Además, la entidad no debería estar aún separada.

Vida de entidad es bastante mucho de la siguiente manera, todo en una misma transacción (entidades fuera de su transacción no se manejan):

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 
+0

Gracias por el ejemplo. Ahora tengo la idea de entidad separada. Aún así creo que debería arrojar alguna excepción diciendo "entidad no está presente o algo" – sachinpkale

3

Sí en caso de fusión o eliminar operación que ha de utilizar una operación de búsqueda o findBy y luego usar el método remove en la entidad recuperada.

Cuestiones relacionadas