Uma analista de dados está implementando uma solução de per...
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
Gabarito: C
Fundamento decisivo: A decisão dependia de identificar o mecanismo de JPA 2.0 que mitiga o problema N+1 por carregamento explícito na consulta, isto é, JOIN FETCH, combinado com associação em carregamento adiado.
- Em questões sobre N+1 em JPA, procure a combinação entre associação em carregamento adiado e uso explícito de JOIN FETCH.
- Não trate comportamento padrão de mapeamento como solução de otimização.
- EAGER generalizado não deve ser aceito como resposta universal para desempenho.
- Em JPA 2.0, desconfie de alternativa baseada em anotação proprietária.
Clique para visualizar este gabarito
Visualize o gabarito desta questão clicando no botão abaixo
Comentários
Veja os comentários dos nossos alunos
No JPA, os relacionamentos entre entidades possuem estratégias de carregamento chamadas FetchType. As duas principais são: EAGER(ansioso) que carrega automaticamente a entidade relacionada junto com a principal e LAZY(preguiçoso) que carrega apenas quando o dado for acessado.
OBS: O padrão varia - ManyToOne costuma ser EAGER, enquanto OneToMany é LAZY.
Consultas que utilizam o JOIN FETCH em JPQL. Esse recurso permite um controle sobre exatamente quais associações devem ser carregadas em uma única query.
A alternativa correta é a C.
Para evitar o problema N+1 e garantir o carregamento eficiente de entidades no JPA 2.0, a analista deve utilizar a anotação @OneToMany com a estratégia FetchType.LAZY e utilizar JOIN FETCH nas consultas JPQL.
Abaixo, os motivos das alternativas:
- Evitando o Carregamento Desnecessário (LAZY): Ao definir um relacionamento como @OneToMany (um para muitos), como o exemplo de um User que possui vários Orders, o uso de FetchType.LAZY garante que a lista de itens relacionados não seja carregada do banco de dados até que seja realmente necessária. Isso evita o carregamento de grandes volumes de dados de forma automática.
- Evitar o Problema N+1 (JOIN FETCH): O problema N+1 ocorre quando o JPA executa uma consulta para a entidade principal e, em seguida, executa "N" consultas adicionais para carregar os dados relacionados de cada registro. Para resolver isso de forma eficiente, a analista deve escrever consultas customizadas (usando a anotação @Query) e incluir a instrução JOIN FETCH. Isso instrui o JPA a trazer a entidade e seus filhos em uma única consulta SQL, otimizando o desempenho.
- Inconsistência das outras opções:
A e D: Configurar relacionamentos como EAGER (padrão em @ManyToOne) pode causar o carregamento de dados não utilizados e, em muitos casos, é justamente o que dispara o problema N+1 ao processar coleções.
B: Consultas manuais sem a técnica de fetch correta não garantem a solução do problema.
E: A anotação @LazyToOne é uma extensão específica do Hibernate e não faz parte do padrão JPA 2.0 puro. Além disso, configurar como false forçaria um carregamento imediato (eager).
Portanto, a combinação de mapeamento preguiçoso (LAZY) com a recuperação explícita via JOIN FETCH em JPQL é a solução padrão para eficiência em persistência de dados com JPA
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo