Какие стратегии загрузки (FetchType) используются в Hibernate по умолчанию?

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

Ответ

Hibernate использует разные стратегии загрузки по умолчанию для разных типов ассоциаций, чтобы сбалансировать производительность и удобство.

Правила по умолчанию:

  1. FetchType.EAGER (жадная загрузка): Для @ManyToOne и @OneToOne.
  2. FetchType.LAZY (ленивая загрузка): Для @OneToMany и @ManyToMany.

Пример сущности:

@Entity
public class Order {
    @Id
    private Long id;

    // Загружается сразу вместе с Order (EAGER)
    @ManyToOne
    private Customer customer;

    // Загружается только при обращении к полю (LAZY)
    @OneToMany(mappedBy = "order")
    private List<Item> items = new ArrayList<>();
}

Почему такие настройки?

  • EAGER для @ManyToOne: Обычно «многие» заказы ссылаются на одного клиента. Загрузка клиента сразу часто нужна и эффективна.
  • LAZY для @OneToMany: У одного заказа может быть много позиций. Их жадная загрузка может привести к N+1 проблеме или избыточному объему данных. Ленивая загрузка позволяет загружать коллекцию только когда она действительно требуется.

Важно: Рекомендуется явно указывать FetchType.LAZY для всех ассоциаций, кроме критически необходимых, и использовать JOIN FETCH в запросах для контролируемой загрузки.