Otra pregunta SCBCD: Merge y EntityManager



(Imagen : Claude Monet - Señora Monet en traje Japonés)

Una más, para mantener el ritmo:

Given:

@PersistenceContext
EntityMAnager em;
public boolean test (Order o){
boolean b = false;
o = em.merge(o);
em.remove(o);
o = em.merge(o);
b = em.contains(o);
return b;

}

Which statement is correct?

The method will return TRUE
The method will return FALSE
The method will throw an exception
The Order instance will be removed from database


Para resolver esto, debemos tener bien claro lo que hace el método merge de EntityManager. Merge nos permite sincronizar los cambios de estado realizados a una entidad no administrada (o sea  no administrada por el EntityManager... los gringos usan "detached")con la base de datos.  Dada la sentencia : B = em.merge(A) podemos inferir que :

  • Si A no es una entidad, se lanzará la excepción IllegalArgumentException
  • Si A no está administrada, su estado es copiado a la instancia administrada B
  • Si A es una entidad nueva, se crea la nueva entidad administrada B y el estado de A es copiado a B
  • Si A es una entidad administrada existente, se ignora la sentencia
  • Si A es una entidad removida (como es nuestro caso, ya que se ejecutó em.remove(o) ), se lanza la excepción  IllegalArgumentException
Por ende, al ejecutar el segundo merge(o) ocurriría la última situación descrita, por lo que seleccionariamos la tercera opción como respuesta.

Aunque nunca llega a ejecutarse, cabe resaltar que EntityManager.contains se utiliza para determinar si una entidad está siendo administrada por el Contexto de Persistencia (o sea ...el EntityManager). De ser así retorna TRUE, caso contrario... FALSE.


Pregunta tomada de ExamWorx

Publicar un comentario