Middle
49
questionbank

Что такое fetch type?

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech

Fetch type в JPA определяет, как связанные сущности будут загружаться из базы данных. Существует два основных типа: EAGER и LAZY.

  • EAGER: Связанная сущность загружается вместе с основной сущностью при первом же запросе. Это удобно, когда связанная сущность почти всегда нужна, но может привести к избыточной загрузке данных и ухудшению производительности при большом числе связей.

    java
  • LAZY: Связанная сущность загружается только при первом обращении к ней (например, вызове геттера). Это позволяет избежать загрузки ненужных данных, но требует дополнительного запроса к базе при каждом обращении к связанной сущности, что может привести к проблеме "N+1 select".

    java

Выбор fetch type — это компромисс между производительностью и удобством. Для большинства коллекций ( @OneToMany, @ManyToMany ) по умолчанию используется LAZY, а для единичных связей ( @ManyToOne, @OneToOne ) — EAGER, за исключением случаев, когда нет аннотации @JoinColumn на владеющей стороне @OneToOne, тогда по умолчанию тоже LAZY. Рекомендуется использовать LAZY по умолчанию и переключаться на EAGER только тогда, когда это оправдано требованиями.

Для оптимизации загрузки при использовании LAZY можно применять JPQL/Criteria запросы с FETCH JOIN или @NamedEntityGraph.