Что такое стратегия загрузки Eager в Hibernate?

«Что такое стратегия загрузки Eager в Hibernate?» — вопрос из категории Hibernate, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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).