Hibernate и JPA
Persistence context, проблема N+1, Spring Data JPA и ленивые загрузки.
- 01Что такое проблема N+1 запросов и как её решать?
N+1 — один запрос за списком и ещё по запросу на связанные данные каждого элемента: 100 заказов → 101 запрос. Причина — ленивая загрузка связей в цикле.
Middle - 02Чем отличается оптимистичная блокировка от пессимистичной?
Пессимистическая — блокируем строку заранее (SELECT ... FOR UPDATE), остальные ждут. Оптимистическая — не блокируем, а при записи проверяем версию (WHERE version = ?); не совпала…
Middle - 03Почему возникает LazyInitializationException в Hibernate и как его правильно лечить?
Ленивую связь трогают после закрытия сессии (вне транзакции, в контроллере или сериализаторе) — прокси не может выполнить запрос и бросает исключение.
Middle - 04Что верно про persistence context (сессию) в JPA?
Persistence context — кэш первого уровня и единица работы: одна сущность в одном экземпляре на сессию, изменения отслеживаются автоматически (dirty checking) и сбрасываются при…
Middle - 05Почему для эндпоинта, отдающего список из тысяч записей, обычно предпочитают проекцию в DTO, а не загрузку сущностей?
Сущность в сессии стоит памяти (снимок для dirty checking) и рискует потянуть ленивые связи. DTO-проекция выбирает ровно нужные поля одним запросом и не управляется сессией.
Middle - 06Что делает ORM?
ORM связывает объекты и таблицы: вы работаете с сущностями, а SQL для загрузки и сохранения генерируется автоматически.
Junior - 07Что даёт Spring Data JPA?
Объявляете интерфейс, наследующий JpaRepository, — Spring создаёт реализацию с CRUD, пагинацией и сортировкой. Запросы — по имени метода (findByEmailAndStatus), через @Query (JPQL…
Middle - 08Почему изменение JPA-сущности внутри @Transactional сохраняется в БД без явного вызова save()?
Dirty checking: сущность, загруженная в транзакции, — managed; при flush (перед коммитом) Hibernate сравнивает её поля со снимком и сам отправляет UPDATE изменённых полей. save()…
Middle - 09Список из 100 заказов рендерится вместе с покупателем каждого, и в логе видно 101 SQL-запрос. Какие способы исправят проблему?
JOIN FETCH в @Query, @EntityGraph на методе репозитория или пакетная загрузка (hibernate.default_batch_fetch_size). EAGER не решает — делает проблему постоянной.
Middle - 10Что делает включённый по умолчанию в Spring Boot режим open-in-view и почему его считают спорным?
Open Session in View держит сессию Hibernate и соединение с базой до конца формирования ответа: ленивые связи «просто работают» в контроллере и сериализации. Цена — соединение…
Middle - 11Что реально делает @Transactional(readOnly = true)?
readOnly = true — оптимизация чтения: Hibernate не делает снимков и flush (FlushMode.MANUAL), драйверу передаётся подсказка setReadOnly(true), можно направить на реплику. Это не…
Middle
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.