Слой данных — место, где Spring-приложения чаще всего теряют производительность и корректность: N+1, длинные транзакции, неработающий @Transactional, неожиданные flush.
Данные и транзакции
Spring Data JPA и Hibernate, @Transactional и его ловушки.
Темы этапа
- Spring Data JPA Основа
Репозитории, запросы, проекции, N+1 и работа Hibernate под капотом.
- Транзакции в Spring Основа
@Transactional, распространение, изоляция, откат и типичные ловушки.
Вопросы с собеседований
Смотреть всеЧто даёт объявление интерфейса, наследующего JpaRepository?Junior
Реализацию генерирует Spring Data: CRUD (save, findById, delete), пагинация и сортировка, и запросы, выведенные из имён методов (findByEmail).
Полный разборЧто даёт Spring Data JPA?Middle
Объявляете интерфейс, наследующий JpaRepository, — Spring создаёт реализацию с CRUD, пагинацией и сортировкой. Запросы — по имени метода (findByEmailAndStatus), через @Query (JPQL или SQL) или Specification.
Полный разборПочему изменение JPA-сущности внутри @Transactional сохраняется в БД без явного вызова save()?Middle
Dirty checking: сущность, загруженная в транзакции, — managed; при flush (перед коммитом) Hibernate сравнивает её поля со снимком и сам отправляет UPDATE изменённых полей. save() не нужен.
Полный разборСписок из 100 заказов рендерится вместе с покупателем каждого, и в логе видно 101 SQL-запрос. Какие способы исправят проблему?Middle
JOIN FETCH в @Query, @EntityGraph на методе репозитория или пакетная загрузка (hibernate.default_batch_fetch_size). EAGER не решает — делает проблему постоянной.
Полный разборЧто делает включённый по умолчанию в Spring Boot режим open-in-view и почему его считают спорным?Middle
Open Session in View держит сессию Hibernate и соединение с базой до конца формирования ответа: ленивые связи «просто работают» в контроллере и сериализации. Цена — соединение занято дольше, N+1 прячется в слое представления.
Полный разборРазборы темы
- Spring Data JPA: репозитории и Hibernate
Абстракция репозитория, derived queries и @Query, persistence context и dirty checking, lazy/N+1 и почему DTO, а не entity.
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.