Ответ
Eager loading (жадная загрузка) — это стратегия Hibernate/JPA, при которой связанные сущности загружаются из базы данных одновременно с родительской сущностью, а не откладываются до момента первого обращения.
Пример с аннотацией @ManyToOne:
@Entity
public class Order {
@Id
private Long id;
@ManyToOne(fetch = FetchType.EAGER)
private Customer customer;
// другие поля
}
При загрузке Order сущность Customer будет загружена сразу.
Как это работает и почему:
- Hibernate выполняет JOIN в одном запросе или дополнительные SELECT-запросы для получения связанных данных.
- Используется, когда связанные данные критически необходимы для работы с основным объектом в большинстве сценариев.
| Плюсы и минусы: | Плюс | Минус |
|---|---|---|
| Связанные данные доступны сразу, нет задержек при первом обращении. | Риск проблемы N+1, если запросы не оптимизированы (например, при загрузке коллекций). | |
| Упрощает логику, не нужно проверять инициализацию прокси. | Увеличивает объем передаваемых данных и время начальной загрузки. | |
| Может привести к избыточным JOIN, если связанные данные не всегда нужны. |
Когда использовать:
- Когда связанная сущность небольшая и почти всегда требуется (например, страна пользователя).
- В противном случае предпочтительнее Lazy loading (
FetchType.LAZY).