Этап 4 из 10 · ≈ 6 ч

Spring Data JPA

Основа с Junior

Репозитории, запросы, проекции, N+1 и работа Hibernate под капотом.

Что важно знать

  • Репозиторий генерирует запросы по имени метода.
  • N+1 — главная проблема; ленивые связи и JOIN FETCH.
  • Dirty checking: изменения управляемой сущности сохраняются при коммите без save.
  • Проекции для чтения, пагинация через Pageable и Slice.

Критерии освоения

Junior ≈ 6 ч

  • Создаёт сущности и репозитории, пишет запросы методами и @Query

Практика. Сделать слой данных для заказов и позиций на Spring Data JPA с тестами на Testcontainers.

Middle ≈ 8 ч

  • Устраняет N+1 через fetch join и entity graph и видит SQL в логах
  • Использует проекции и пагинацию для больших выборок
  • Объясняет persistence context и dirty checking

Практика. Найти N+1 и лишние запросы в учебном проекте через логи Hibernate и сократить число запросов на странице до константы.

Проверка знаний

Войдите, чтобы пройти тест: сданный тест отмечает тему пройденной на карте и в ИПР.

Вопросы с собеседований

Смотреть все
Что верно про persistence context (сессию) в JPA?Middle

Persistence context — кэш первого уровня и единица работы: одна сущность в одном экземпляре на сессию, изменения отслеживаются автоматически (dirty checking) и сбрасываются при flush.

Полный разбор
Что даёт объявление интерфейса, наследующего 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 прячется в слое представления.

Полный разбор
Что делает ORM?Junior

ORM связывает объекты и таблицы: вы работаете с сущностями, а SQL для загрузки и сохранения генерируется автоматически.

Полный разбор
Что такое JDBC?Junior

JDBC — стандартный API Java для работы с реляционными базами: Connection, PreparedStatement, ResultSet. Реализацию для конкретной СУБД поставляет драйвер.

Полный разбор
Чем primary key отличается от unique-ограничения?Junior

Первичный ключ — главный идентификатор строки: уникален, NOT NULL, один на таблицу, на него ссылаются внешние ключи. UNIQUE — дополнительная гарантия уникальности, таких может быть много.

Полный разбор

Разборы темы

← Вся карта «Spring»

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования