Ответ
spring.jpa.open-in-view — это настройка, которая контролирует, будет ли сессия JPA (Hibernate) оставаться открытой на протяжении всего HTTP-запроса.
true(значение по умолчанию до Spring Boot 2.x): Сессия и, как следствие, подключение к БД, остаются открытыми до завершения рендеринга представления (View). Это позволяет выполнять ленивую загрузку (LAZY) связанных сущностей даже в слое представления (например, в Thymeleaf-шаблоне).false(рекомендуемое значение): Сессия закрывается сразу после завершения сервисного слоя или транзакции. Ленивая загрузка вне транзакции вызоветLazyInitializationException.
Почему рекомендуется отключать (open-in-view=false):
- Маскировка проблем N+1: При lazy-загрузке в представлении каждый обращение к коллекции генерирует отдельный SQL-запрос, что сложно отследить.
- Долгое удержание соединения: Соединение с БД занято всё время запроса, что снижает доступность пула соединений в высоконагруженных системах.
- Нарушение слоистой архитектуры: Перенос логики загрузки данных в слой представления.
Правильная альтернатива при open-in-view=false:
// Использование @EntityGraph для явного указания загружаемых связей
@EntityGraph(attributePaths = {"orders", "orders.items"})
List<Customer> findAllWithOrders();
// Или явный JPQL с JOIN FETCH
@Query("SELECT c FROM Customer c JOIN FETCH c.orders WHERE c.id = :id")
Customer findByIdWithOrders(@Param("id") Long id);
Таким образом, данные загружаются эффективно и предсказуемо на уровне репозитория или сервиса.