Me he encontrado con una situación (que creo que es extraña pero es bastante normal) en la que utilizo EntityManager.getReference (LObj.getClass(), LObj .getId()) para obtener una entidad de base de datos y luego pasar el objeto devuelto para que se conserve en otra tabla.Cuándo utilizar EntityManager.find() vs EntityManager.getReference()
Así que, básicamente, el flujo fue de esta manera:
class TFacade{ createT(FObj, AObj) { T TObj = new T(); TObj.setF(FObj); TObj.setA(AObj); ... EntityManager.persist(TObj); ... L LObj = A.getL(); FObj.setL(LObj); FFacade.editF(FObj); } } @TransactionAttributeType.REQUIRES_NEW class FFacade{ editF(FObj){ L LObj = FObj.getL(); LObj = EntityManager.getReference(LObj.getClass(), LObj.getId()); ... EntityManager.merge(FObj); ... FLHFacade.create(FObj, LObj); } } @TransactionAttributeType.REQUIRED class FLHFacade{ createFLH(FObj, LObj){ FLH FLHObj = new FLH(); FLHObj.setF(FObj); FLHObj.setL(LObj); .... EntityManager.persist(FLHObj); ... } }
que estaba recibiendo la siguiente excepción "java.lang.IllegalArgumentException: entidad desconocida: com.my.persistence.L $$ $$ EnhancerByCGLIB 3e7987d0"
Después de verlo por un tiempo, finalmente descubrí que era porque estaba usando el método EntityManager.getReference() que estaba obteniendo la excepción anterior ya que el método devolvía un proxy.
Esto hace que me pregunte, cuando es aconsejable utilizar el método EntityManager.getReference() en lugar del método EntityManager.find()?
EntityManager.getReference() arroja una EntityNotFoundException si no puede encontrar la entidad que se busca, que es muy conveniente en sí misma. El método EntityManager.find() simplemente devuelve null si no puede encontrar la entidad.
Con respecto a los límites de transacción, me parece que necesitaría usar el método find() antes de pasar la entidad recién descubierta a una nueva transacción. Si usa el método getReference(), probablemente terminaría en una situación similar a la mía con la excepción anterior.
Ha olvidado mencionar que estoy utilizando Hibernate como proveedor de JPA. – SibzTer