Quando usar EntityManager.find () vs EntityManager.getReference () com JPA
Eu me deparei com uma situação (que eu acho que é estranho, mas é possivelmente normal) onde eu uso o EntityManager.getReference (LObj.getClass (), LObj.getId ()) para obter uma entidade de banco de dados e, em seguida, passar o objeto retornado para ser persistido em outra tabela.
Então basicamente o fluxo era assim:
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); ... } }
Eu estava recebendo a seguinte exceção "java.lang.IllegalArgumentException: entidade desconhecida: com.my.persistence.L $ EnhancerByCGLIB $ 3e7987d0"
Depois de examinar isso por um tempo, finalmente descobri que era porque eu estava usando o método EntityManager.getReference () que estava recebendo a exceção acima, pois o método estava retornando um proxy.
Isso me faz pensar,quando é aconselhável usar o método EntityManager.getReference () em vez do método EntityManager.find ()?
EntityManager.getReference () lança uma EntityNotFoundException se não conseguir localizar a entidade que está sendo pesquisada, o que é muito conveniente em si. O método EntityManager.find () meramente retorna null se não puder encontrar a entidade.
Com relação aos limites de transação, parece-me que você precisaria usar o método find () antes de passar a entidade recém-descoberta para uma nova transação. Se você usar o método getReference (), provavelmente acabaria em uma situação semelhante à minha com a exceção acima.