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.