Sobes.tech
Junior — Middle

Como resolver o problema N+1 ao usar Hibernate e quais abordagens existem para isso?

sobes.tech IA

Resposta da IA

O problema N+1 no Hibernate ocorre quando, para carregar uma coleção de entidades, é executada uma consulta principal e N consultas adicionais para as entidades relacionadas. Isso leva a uma redução significativa no desempenho.

As principais formas de resolver:

  1. Uso de JOIN FETCH em JPQL/HQL — permite carregar entidades relacionadas numa única consulta.
String hql = "SELECT p FROM Parent p JOIN FETCH p.children WHERE p.id = :id";
Parent parent = session.createQuery(hql, Parent.class)
                       .setParameter("id", parentId)
                       .getSingleResult();
  1. Anotação @Fetch(FetchMode.JOIN) — força o Hibernate a usar join ao carregar coleções.

  2. Graphos de entidades (Entity Graphs) — método declarativo para indicar quais relações carregar imediatamente.

  3. Carregamento em lotes (Batch fetching) — carrega entidades relacionadas em lotes, reduzindo o número de consultas.

  4. **Uso de @NamedEntityGraph e EntityManager para otimizar o carregamento.

A escolha do método depende do cenário específico e da estrutura de dados, mas a ideia principal é minimizar o número de consultas carregando os dados relacionados junto com a entidade principal.