Kiedy używać EntityManager.find () vs EntityManager.getReference () z JPA

Natknąłem się na sytuację (którą uważam za dziwną, ale prawdopodobnie całkiem normalną), w której używam EntityManager.getReference (LObj.getClass (), LObj.getId ()), aby uzyskać jednostkę bazy danych, a następnie przekazać zwrócony obiekt do utrzymywać się w innym stole.

Tak więc przepływ był taki:

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);
    ...
  }
}

Otrzymałem następujący wyjątek „java.lang.IllegalArgumentException: Nieznana jednostka: com.my.persistence.L $ EnhancerByCGLIB $ 3e7987d0”

Po przeanalizowaniu go przez chwilę, w końcu odkryłem, że to dlatego, że używałem metody EntityManager.getReference (), która otrzymywała powyższy wyjątek, ponieważ metoda zwracała proxy.

To mnie zastanawia,kiedy wskazane jest użycie metody EntityManager.getReference () zamiast metody EntityManager.find ()?

EntityManager.getReference () zgłasza wyjątek EntityNotFoundException, jeśli nie może znaleźć poszukiwanej jednostki, która jest bardzo wygodna sama w sobie. Metoda EntityManager.find () zwraca tylko wartość null, jeśli nie może znaleźć encji.

Jeśli chodzi o granice transakcji, dźwięki dla mnie, jak gdybyś musiał użyć metody find (), przed przekazaniem nowo znalezionej jednostki do nowej transakcji. Jeśli użyjesz metody getReference (), prawdopodobnie skończysz w sytuacji podobnej do mojej z powyższym wyjątkiem.

questionAnswers(5)

yourAnswerToTheQuestion