Mi sono imbattuto in una situazione (che a mio avviso è strana ma è probabilmente abbastanza normale) in cui utilizzo EntityManager.getReference (LObj.getClass(), LObj .getId()) per ottenere un'entità database e quindi passare l'oggetto restituito da mantenere in un'altra tabella.Quando utilizzare EntityManager.find() vs EntityManager.getReference()
Quindi, in pratica il flusso era così:
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); ... } }
mi è stato sempre la seguente eccezione "java.lang.IllegalArgumentException: un'entità sconosciuta: com.my.persistence.L $$ EnhancerByCGLIB $$ 3e7987d0"
Dopo averlo esaminato per un po ', ho finalmente capito che era perché stavo usando il metodo EntityManager.getReference() che stavo ottenendo l'eccezione di cui sopra come il metodo stava restituendo un proxy.
Questo mi fa chiedere, quando è opportuno utilizzare il metodo invece del metodo EntityManager.find() EntityManager.getReference()?
EntityManager.getReference() genera un'entitàNotFoundException se non riesce a trovare l'entità da cercare, il che è molto conveniente in sé. Il metodo EntityManager.find() restituisce semplicemente null se non riesce a trovare l'entità.
Per quanto riguarda i confini delle transazioni, mi sembra che sarebbe necessario utilizzare il metodo find() prima di passare l'entità appena trovata a una nuova transazione. Se si utilizza il metodo getReference(), si rischia di finire in una situazione simile alla mia con l'eccezione di cui sopra.
Ho dimenticato di menzionare, sto usando Hibernate come provider JPA. – SibzTer