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.

questionAnswers(5)

yourAnswerToTheQuestion