Получить доступ

Что делает включённый по умолчанию в Spring Boot режим open-in-view и почему его считают спорным?

MiddleSpring Data JPA и HibernateSpring BootHibernate / JPA
Ещё спрашивают так:
  • Нужно ли выключать spring.jpa.open-in-view?
Коротко

Open Session in View держит сессию Hibernate и соединение с базой до конца формирования ответа: ленивые связи «просто работают» в контроллере и сериализации. Цена — соединение занято дольше, N+1 прячется в слое представления.

  • В Spring Boot включён по умолчанию с предупреждением в логе
  • Рекомендуют spring.jpa.open-in-view=false и загрузку данных в сервисе
  • После выключения появятся LazyInitializationException — их и надо исправить

А ещё Для API особенно вреден: сериализация сущностей тянет ленивые связи

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Свойство spring.jpa.open-in-view включено по умолчанию, и Spring Boot даже пишет об этом предупреждение при старте. Плюс очевиден: обращение к ленивой связи в контроллере или при сериализации не падает. Минусы серьёзнее: соединение с базой удерживается на всё время формирования ответа, что при медленном клиенте или тяжёлом рендеринге бьёт по пулу; ленивые подгрузки происходят вне явной транзакции и потому размазаны по слоям; а главное — N+1 перестаёт проявляться как ошибка и тихо деградирует производительность. Рекомендуемая практика: выключить режим и явно загружать нужные данные в сервисном слое, отдавая наружу DTO.

Что хотят услышать

  • Что делает OSIV.
  • Почему спорный: соединения, скрытые запросы.
  • Что делать вместо.

Частые ошибки

  • Оставлять режим включённым и считать отсутствие LazyInitializationException признаком корректной загрузки.
  • Сериализовать сущности напрямую в ответ вместо DTO.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Держит persistence context открытым до конца обработки запроса: LazyInitializationException исчезает, но соединение удерживается дольше и ленивые загрузки происходят вне транзакции
  • ✗Открывает отдельную транзакцию на каждый запрос к репозиторию
  • ✗Кэширует результаты запросов между HTTP-запросами
  • ✗Отключает ленивую загрузку связей целиком

Что спросят дальше

  • Что произойдёт после выключения open-in-view и как это чинить правильно?
  • Почему сущность — плохой формат ответа API?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем