Uma analista de dados está implementando uma solução de per...

Próximas questões
Com base no mesmo assunto
Q3874361 Programação
Uma analista de dados está implementando uma solução de persistência de dados para um novo sistema de gerenciamento de documentos utilizando JPA 2.0. Para otimizar o desempenho e evitar o problema N+1, ela precisa garantir que as entidades relacionadas sejam carregadas de forma eficiente. Para carregar as entidades via JPA 2.0 corretamente e mitigar o problema N+1 de forma eficiente, a analista deve:
Alternativas

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.

Tema central: N+1 em JPA 2.0
Análise das alternativas
A
Errada
Incorreta porque deixar @ManyToOne sem estratégia explícita não é medida eficiente contra N+1 e depende do padrão, não do mecanismo pedido.
B
Errada
Incorreta porque consultas JPQL manuais, por si sós, não garantem o carregamento eficiente das relações; faltou o JOIN FETCH.
C
Certa
A alternativa C está correta porque combina carregamento LAZY na associação com JOIN FETCH na JPQL, permitindo trazer a relação na mesma consulta quando necessário e reduzir o N+1.
D
Errada
Incorreta porque EAGER em todos os @ManyToOne não é solução geral para N+1 e pode gerar carregamento excessivo.
E
Errada
Incorreta porque usa anotação não padrão de JPA 2.0 e, além disso, a descrição do efeito não corresponde ao que foi afirmado.
Pegadinha da questão
A confusão estava em trocar o mecanismo decisivo, JOIN FETCH, por soluções aparentes como default de mapeamento, EAGER generalizado, consulta manual vaga ou anotação proprietária.
Dica para questões semelhantes
  • 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