Join Fetch carrega todas as entidades One-to-One?

4 respostas
felipe_gdr

Olá

estou começando com JPA e tenho uma dúvida que acredito que seja simples.

Tenho a seguinte relação:

Funcionário <-> (many to one) <-> Pessoa <-> (one to one) <-> Documentos

Ou seja, uma pessoa tem apenas um conjunto de documentos e pode ter vários registros de funcionário.

Minha tela mostra o nome (Pessoa) e a data de admissão (Funcionário). Consegui reverter o problema N+1 usando o JOIN FETCH em minha query. Antes de eu adicionar a entidade documentos, a tela carregava rapidamente. Porém, depois que adicionei essa entidade o carregamento ficou super lento, pelo console, consigo ver que está sendo executada a query sobre a tabela de documentos inúmeras vezes. Me parece que o problema do N+1 voltou a ocorrer. Achei estranho, pois em momento nenhum uso propriedades da tabela de documentos em minha tela.

O fato de usar o JOIN FETCH de Funcionário para Pessoa, faz com que o container busque por todas as tabelas relacionadas a Pessoa? Mesmo que eu tenha declarado a relação como LAZY?

Abs!

4 Respostas

Hebert_Coelho

O join fetch na consulta anula o LAZY da anotação.

É isso?

felipe_gdr

Mais ou menos, rs.

O problema é que, aparentemente, ele está anulando o LAZY da relação Funcionário->Pessoa, e também o LAZY da relação Pessoa->Documentos. Sendo que essa última anulação não é necessária para mim, pois nesse momento não uso nenhuma propriedade de Documentos.

Tem como evitar esse “cascading” de anulação de LAZY?

Hebert_Coelho

felipe_gdr:
Mais ou menos, rs.

O problema é que, aparentemente, ele está anulando o LAZY da relação Funcionário->Pessoa, e também o LAZY da relação Pessoa->Documentos. Sendo que essa última anulação não é necessária para mim, pois nesse momento não uso nenhuma propriedade de Documentos.

Tem como evitar esse “cascading” de anulação de LAZY?

Eu vejo que para fazer isso, você teria que realizar a consulta não por Funcionário, mas talvez por Pessoa/Documentos.

felipe_gdr

Certo,

o problema aí é que a entidade Funcionario tem relação com mais centenas de outras tabelas, se eu começasse a consulta de Pessoa para Funcionário, teria esse mesmo problema, só que bem maior.

Criado 16 de outubro de 2012
Ultima resposta 16 de out. de 2012
Respostas 4
Participantes 2