2
respostas

Duvida FETCH

Tenho uma duvida que na verdade está mais relacionada ao Hibernate, pelo que pesquisei a diferença entre os FETCH EAGER é LAZY é a seguinte: LAZY: Carrega apenas o objeto principal EAGER: Carrega o principal e seus relacionamentos

Fazendo alguns testes aqui me surgiu a seguinte duvida, tenho 2 classes, Demanda e Periodicidade as quais são relacionadas, uma Demanda pode ter uma Periodicidade e uma Periodicidade pode ter varias Demandas.

Se no DTO de Demanda eu coloco o atributo Periodicidade periodicidade e chamo ela através de this.periodicidade = demanda.getPeriodicidade() eu preciso que o FETCH seja EAGER, até ai tudo bem, mas se eu mudo a propriedade para String periodicidade e chamo através de this.periodicidade = demanda.getPeriodicidade().getNome() ela funciona em LAZY.

Não deveria dar erro também uma vez que o LAZY não está carregando os relacionamentos?

2 respostas

Oi Rafael,

O Spring por padrão mantém o EntityManager da JPA aberto durante a requisição.

Se você você carrega um objeto Demanda cujo atributo peridicidade está marcado com fetch = LAZY, a JPA vai fazer apenas 1 select para carregar a Demada, mas assim que o demanda.getPeriodicidade().getNome() for chamado, um novo select será disparado, pois o EntityManager ainda está aberto.

Daria erro apenas se o EntityManager já estivesse fechado no momento de acessar o atributo.

Mas porque quanto o fetch for lazy se eu chamar o demanda.getPeriodicidade() ele dá erro? Isso que não ficou claro, ele não consegue como lazy carregar o demanda.getPeriodicidade, mas consegue carregar o demanda.getPeriodicidade().getNome()