Natknąłem się na sytuację (która, jak myślę, jest dziwna, ale jest prawdopodobnie całkiem normalna), w której używam EntityManager.getReference (LObj.getClass(), LObj .getId()), aby uzyskać jednostkę bazy danych, a następnie przekazać zwracany obiekt do utrwalenia w innej tabeli.Kiedy używać EntityManager.find() kontra EntityManager.getReference()
Więc w zasadzie przepływ było tak:
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); ... } }
ja otrzymuję następujący wyjątek "java.lang.IllegalArgumentException: nieznany podmiot: com.my.persistence.L $$ EnhancerByCGLIB $$ 3e7987d0"
Po obejrzeniu go przez chwilę, w końcu zorientowałem się, że to dlatego, że używałem metody EntityManager.getReference(), że otrzymałem powyższy wyjątek, ponieważ metoda zwracała proxy.
Zastanawia mnie, , kiedy należy używać metody EntityManager.getReference() zamiast metody EntityManager.find()?
EntityManager.getReference() generuje wyjątek EntityNotFoundException, jeśli nie może znaleźć poszukiwanego obiektu, co jest bardzo wygodne samo w sobie. Metoda EntityManager.find() zwraca tylko wartość null, jeśli nie może znaleźć elementu.
Jeśli chodzi o granice transakcji, dźwięki brzmią tak, jakbyś musiał użyć metody find() przed przekazaniem nowo znalezionego obiektu do nowej transakcji. Jeśli użyjesz metody getReference(), prawdopodobnie skończysz w sytuacji podobnej do mojej z powyższym wyjątkiem.
Zapomniałem wspomnieć, że używam Hibernate jako dostawcy JPA. – SibzTer