2011-11-12 20 views
5

Me gustaría saber qué implementación del método remove es mejor:APP y DAO ejecución de operación de eliminación

public void remove(T t) { 
    entityManager.remove(entityManager.merge(t)); 
} 

public void remove(PK pk) { 
    entityManager.remove(entityManager.getReference(entityType, pk)); 
} 

He leído un buen montón de artículos acerca de esto y en casi cada uno de ellos es similar al primer enfoque, que me parece bastante innecesario ya que se puede hacer sin la necesidad de recuperar toda la entidad de la base de datos (si no está presente en el contexto de persistencia) y luego eliminarla. ¿Hay algo que me falta y el primer enfoque es realmente mejor?

+1

¿Por qué no llamas a 'EntityManager.remove (t)'? – stacker

+0

@stacker: deseo que este método elimine entidades administradas y separadas. – VaclavDedik

Respuesta

1

Usted puede comprobar si la entidad se maneja mediante la invocación de

boolean isManaged = entityManager.contains(t); 

Si esto es cierto sólo tiene que llamar

entityManager.remove(t); 

de lo contrario su segundo enfoque parece mejor ya que la fusión podría causar más actividad dB debido a la carga ansiosa (si está configurado). El javadoc en getReference dice "Obtener una instancia, cuyo estado puede ser capturado de forma perezosa. Si la instancia solicitada no existe en la base de datos, arroja EntityNotFoundException cuando se accede por primera vez al estado de la instancia (el tiempo de ejecución del proveedor de persistencia permite lanzar EntityNotFoundException cuando getReference (java.lang.Class, java.lang.Object) se llama.) La aplicación no debe esperar que el estado de la instancia esté disponible al momento del desprendimiento, a menos que la aplicación lo haya accedido mientras el administrador de la entidad estaba abierto. "

En resumen, la entidad tiene que ser gestionado therfore, sugeriría:

em.remove(em.contains(r) ? r : em.merge(r)); 
+0

Esta solución parece buena, sin embargo, me gustaría saber si alguien ha hecho alguna medición si ejecutar una consulta JPQL/HQL en la línea de "ELIMINAR DE LA Entidad e DONDE e.id =: id" sería más rápido que llamar fusionar y luego eliminar, cuando la entidad no está contenida en el administrador? ¿La sobrecarga de construir una consulta no tiene que recuperar la entidad? – esaj

+1

Me parece innecesario, si la entidad está presente en el contexto de persistencia, invocar em.merge (r) devuelve la referencia a la entidad gestionada. De eso no se trata esta pregunta. Lo que me molesta es cuando la entidad no está presente en el contexto de persistencia ... porque entonces el método de fusión debe recuperar la entidad de la base de datos, lo que en este caso me parece innecesario ya que solo necesito eliminar una fila de la base de datos. – VaclavDedik

Cuestiones relacionadas