Ответ
FetchType — это перечисление в JPA, определяющее стратегию загрузки связанных сущностей. Оно управляет тем, когда Hibernate загружает данные из базы.
Два типа загрузки:
-
FetchType.EAGER — связанная сущность загружается немедленно вместе с владельцем.
- По умолчанию для
@ManyToOneи@OneToOne. - Риск: Может привести к проблеме N+1 запроса и избыточному потреблению памяти, если загружается много данных.
- По умолчанию для
-
FetchType.LAZY — связанная сущность загружается только при первом обращении к ней.
- По умолчанию для
@OneToManyи@ManyToMany. - Риск: Может вызвать
LazyInitializationException, если доступ происходит вне активной сессии Hibernate (например, в слое представления после закрытия транзакции).
- По умолчанию для
Пример использования:
@Entity
public class Order {
@Id
private Long id;
// Покупатель загрузится только при вызове order.getCustomer()
@ManyToOne(fetch = FetchType.LAZY)
private Customer customer;
// Все позиции заказа загрузятся сразу при загрузке Order
@OneToMany(fetch = FetchType.EAGER, mappedBy = "order")
private List<OrderItem> items;
}
Рекомендации:
- Предпочитайте LAZY загрузку по умолчанию для оптимизации производительности.
- Используйте EAGER осознанно, только когда связанные данные нужны практически всегда.
- Для решения проблемы N+1 с LAZY используйте JOIN FETCH в JPQL или
@EntityGraph.