Что делает включённый по умолчанию в Spring Boot режим open-in-view и почему его считают спорным?
- Нужно ли выключать spring.jpa.open-in-view?
Open Session in View держит сессию Hibernate и соединение с базой до конца формирования ответа: ленивые связи «просто работают» в контроллере и сериализации. Цена — соединение занято дольше, N+1 прячется в слое представления.
- В Spring Boot включён по умолчанию с предупреждением в логе
- Рекомендуют
spring.jpa.open-in-view=falseи загрузку данных в сервисе - После выключения появятся LazyInitializationException — их и надо исправить
А ещё Для API особенно вреден: сериализация сущностей тянет ленивые связи
Подробно
Свойство spring.jpa.open-in-view включено по умолчанию, и Spring Boot даже пишет об этом предупреждение при старте. Плюс очевиден: обращение к ленивой связи в контроллере или при сериализации не падает. Минусы серьёзнее: соединение с базой удерживается на всё время формирования ответа, что при медленном клиенте или тяжёлом рендеринге бьёт по пулу; ленивые подгрузки происходят вне явной транзакции и потому размазаны по слоям; а главное — N+1 перестаёт проявляться как ошибка и тихо деградирует производительность. Рекомендуемая практика: выключить режим и явно загружать нужные данные в сервисном слое, отдавая наружу DTO.
Что хотят услышать
- Что делает OSIV.
- Почему спорный: соединения, скрытые запросы.
- Что делать вместо.
Частые ошибки
- Оставлять режим включённым и считать отсутствие LazyInitializationException признаком корректной загрузки.
- Сериализовать сущности напрямую в ответ вместо DTO.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Держит persistence context до конца запроса: lazy-загрузка работает, но соединение занято дольше
- ✗Открывает отдельную транзакцию на каждый вызов репозитория и коммитит её после ответа
- ✗Кэширует результаты запросов между HTTP-запросами
- ✗Отключает ленивую загрузку связей целиком
Что спросят дальше
- Что произойдёт после выключения open-in-view и как это чинить правильно?
- Почему сущность — плохой формат ответа API?
Разбор темы
- Spring Data JPA: репозитории и Hibernate
Абстракция репозитория, derived queries и @Query, persistence context и dirty checking, lazy/N+1 и почему DTO, а не entity.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.