Sobes.tech
Middle

O que é o tipo fetch?

sobes.tech IA

Resposta da IA

O tipo de fetch em JPA determina como as entidades relacionadas serão carregadas a partir do banco de dados. Existem dois tipos principais: EAGER e LAZY.

  • EAGER: A entidade relacionada é carregada junto com a entidade principal na primeira consulta. Isso é útil quando a entidade relacionada é quase sempre necessária, mas pode levar a um carregamento excessivo de dados e a uma diminuição de desempenho quando há muitas relações.

    // Exemplo de carregamento EAGER
    @ManyToOne(fetch = FetchType.EAGER)
    private Address address; // Address será carregado junto com User
    
  • LAZY: A entidade relacionada é carregada somente quando acessada pela primeira vez (por exemplo, ao chamar o getter). Isso evita carregar dados desnecessários, mas requer uma consulta adicional ao banco de dados a cada acesso à entidade relacionada, o que pode causar o problema de "N+1 select".

    // Exemplo de carregamento LAZY
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
    private List<Order> orders; // Orders será carregado somente ao chamar user.getOrders()
    

A escolha do tipo de fetch é um compromisso entre desempenho e conveniência. Para a maioria das coleções (@OneToMany, @ManyToMany), o padrão é LAZY, e para relações unitárias (@ManyToOne, @OneToOne), é EAGER, exceto nos casos em que não há a anotação @JoinColumn no lado proprietário de @OneToOne, nesse caso, também por padrão, é LAZY. Recomenda-se usar LAZY por padrão e mudar para EAGER apenas quando justificado pelos requisitos.

Para otimizar o carregamento ao usar LAZY, pode-se aplicar consultas JPQL/Criteria com FETCH JOIN ou @NamedEntityGraph.