unit query example curso context java jpa entitymanager

java - query - ¿Cuál es la diferencia entre EntityManager.find() y EntityManger.getReference()?



jpa query example (3)

El libro Beginning Java EE 6 Platform con GlassFish 3 , menciona las diferencias en la página 135: "Finding By ID"

find() si se encuentra la entidad, se devuelve; si no se encuentra, se devuelve un valor nulo.

MyEntity obj = em.find(MyEntity.class, id); if(obj != null){ // Process the object }

getReference() está destinado a situaciones en las que se necesita una instancia de entidad gestionada, pero no se accede a ningún otro dato, que no sea potencialmente la clave primaria de la entidad.

try { MyEntity obj = em.getReference(MyEntity.class, id); // Process the object } catch (EntityNotFoundException e) { // Entity Not Found }

Cuál es la diferencia entre

<T> T EntityManager.find(Class<T> entityClass, Object primaryKey) and <T> T EntityManager.getReference(Class<T> entityClass, Object primaryKey)

?

Creo que getReference devuelve la entidad si se administra. y encuentre la entidad devuelve si se gestiona; de lo contrario, ejecuta SQL en la base de datos para que se administre.

Por favor confirmar.

Contexto: de webapp obtengo la clave primaria del objeto que se eliminará (pk de tipo long); a la entidad se debe administrar para eliminar.

EntityManager.remove(Object entity)

pasar la entidad gestionada a entitymanager eliminar el método ''cuál es la mejor y correcta opción? buscar o obtener referencia? ''


JPA tiene el concepto de EntityManager, como usted sabe. Durante su trabajo en el administrador de la entidad, algunos objetos se cargan desde la base de datos, pueden modificarse y luego enviarse a la base de datos.

find() tiene que devolver una instancia inicializada de su objeto. Si aún no está cargado en EntityManager, se recupera de la base de datos.

getReference() puede devolver un proxy en lugar de una instancia inicializada, si la entidad no se ha cargado anteriormente en EntityManager. En este proxy, solo el atributo de clave principal se inicializa. Los proxies se pueden crear sin golpear la base de datos, porque el único atributo inicializado ya se le da a la función getReference ().

Esto último es útil cuando se tiene una entidad A haciendo referencia a una entidad B, y se desea establecer el atributo b de A a B, sin tener que cargar B desde la base de datos.

Solo si hace referencia a otros atributos de B, el proxy se inicializará.


getReference() no recupera el objeto completo sino solo un proxy y, por lo tanto, puede ser más eficiente si no se accede a los miembros del objeto.

Por ejemplo, al crear un nuevo objeto para insertar en su base de datos, podría tener que referirse a otro objeto que ya ha sido almacenado en la base de datos.

Para que JPA almacene el nuevo objeto correctamente, solo se necesita la clave primaria del objeto referido. Al usar getReference() obtienes un proxy que contiene la clave principal y ahorras el costo de cargar el objeto completo.