Middle
47
questionbank

Что означает FetchType.LAZY в JPA и как он влияет на загрузку связанных сущностей?

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

FetchType.LAZY в JPA означает отложенную загрузку связанных сущностей. Вместо загрузки всей связанной коллекции или отдельной сущности при получении основной сущности, JPA создает прокси-объект. Фактическая загрузка данных из базы произойдет только при первом обращении к полям или методам прокси-объекта.

Это позволяет:

  • Оптимизировать производительность: Избежать извлечения большого объема данных из базы, когда они не используются.
  • Уменьшить потребление памяти: Загружать только необходимые данные.

По умолчанию для большинства связей (@OneToMany, @ManyToMany) используется FetchType.LAZY, а для @OneToOne И @ManyToOneFetchType.EAGER. Можно явно указать тип загрузки:

java

Проблемы с FetchType.LAZY:

  • LazyInitializationException: Может возникнуть, если вы попытаетесь получить доступ к отложенно загруженной сущности после того, как сессия, в которой она была загружена, закрыта.
  • N+1 проблема: Если вы итерируете по коллекции сущностей с отложенной загрузкой и обращаетесь к каждой связанной сущности, для каждой сущности коллекции будет выполнен отдельный запрос к базе.

Для решения этих проблем можно использовать:

  • Явное получение связанных данных с помощью JOIN FETCH в JPQL:

    java
  • Настройки провайдера JPA (например, использование батчинга).

  • Аннотация @Fetch(FetchMode.JOIN) или @Fetch(FetchMode.SELECT) в Hibernate.