J'ai rencontré une situation (qui je pense est bizarre mais il se peut tout à fait normal) où j'utilise l'EntityManager.getReference(LObj.getClass(), LObj.getId()) pour obtenir une base de données d'entité et de passer ensuite l'objet retourné pour être conservées dans une autre table.
Donc, fondamentalement, le flux était comme ça:
classe TFacade{ createT(FObj, AObj) { T TObj = new T(); TObj.setF(FObj); TObj.setA(AObj); ... L'EntityManager.persist(TObj); ... L LObj = A. getL(); FObj.setL(LObj); FFacade.editF(FObj); } } @TransactionAttributeType.REQUIRES_NEW classe FFacade{ editF(FObj){ L LObj = FObj.getL(); LObj = EntityManager.getReference(LObj.getClass(), LObj.getId()); ... L'EntityManager.de fusion(FObj); ... FLHFacade.créer(FObj, LObj); } } @TransactionAttributeType.REQUIS classe FLHFacade{ createFLH(FObj, LObj){ FLH FLHObj = new FLH(); FLHObj.setF(FObj); FLHObj.setL(LObj); .... L'EntityManager.persist(FLHObj); ... } }
J'ai été faire la suite de "l'exception java.lang.IllegalArgumentException: entité Inconnue: com.mon.la persistance.L$$EnhancerByCGLIB$$3e7987d0"
Après la regarde pendant un moment, j'ai finalement compris que c'était parce que j'étais à l'aide de l'EntityManager.getReference() la méthode que j'étais l'exception ci-dessus que la méthode était de retour d'un proxy.
Cela me fait me demander, quand est-il conseillé d'utiliser l'EntityManager.getReference() la méthode la place de l'EntityManager.méthode find() ?
L'EntityManager.getReference() renvoie une EntityNotFoundException si il ne trouve pas l'entité recherchée qui est très pratique en elle-même. L'EntityManager.méthode find() ne fait que retourner la valeur null si il ne trouve pas l'entité.
En ce qui concerne les limites de transaction, me semble que vous devez utiliser la méthode find() avant de passer à la toute nouvelle entité à une nouvelle transaction. Si vous utilisez le getReference() la méthode alors vous seriez probablement se retrouver dans une situation similaire à la mienne avec l'exception ci-dessus.