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

Почему для эндпоинта, отдающего список из тысяч записей, обычно предпочитают проекцию в DTO, а не загрузку сущностей?

MiddleORM и N+1Hibernate / JPASpring Data
Ещё спрашивают так:
  • Зачем использовать DTO-проекции в JPA?
Коротко

Сущность в сессии стоит памяти (снимок для dirty checking) и рискует потянуть ленивые связи. DTO-проекция выбирает ровно нужные поля одним запросом и не управляется сессией.

  • Для списков и чтения — проекции; для изменений — сущности
  • Spring Data: интерфейсные проекции, select new ...Dto(...), нативные запросы
  • Меньше данных по сети, нет N+1 и LazyInitializationException

А ещё Read-only транзакции и hint readOnly тоже снижают накладные расходы

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

Подробно

Для чтения отслеживание изменений — чистые накладные расходы: сессия хранит копию каждой сущности, чтобы сравнить её при flush, хотя менять ничего не собираются. Добавьте риск ленивых связей, которые при сериализации превращаются в N+1 или в LazyInitializationException, — и получается, что сущность плохо подходит на роль формата ответа. Проекция (интерфейсная или через конструктор DTO в запросе) выбирает только нужные колонки, поэтому уменьшается и объём выборки, и работа ORM. Дополнительный архитектурный аргумент: DTO отвязывает контракт API от схемы базы, и переименование колонки перестаёт быть ломающим изменением.

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

  • Цена загрузки сущностей.
  • Что даёт проекция.
  • Когда сущности, а когда DTO.

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

  • Сериализовать сущности напрямую в ответ API.
  • Забывать про readOnly для чисто читающих транзакций.

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

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

Показать варианты и ответ
  • ✓Сущности попадают в persistence context со снимками для dirty checking и тянут связи; проекция выбирает только нужные колонки и не отслеживается
  • ✗Сущности нельзя сериализовать в JSON
  • ✗Проекция автоматически кэшируется во втором уровне
  • ✗JPA запрещает возвращать сущности из репозитория

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

  • Чем интерфейсная проекция отличается от DTO в конструкторе запроса?
  • Как readOnly влияет на dirty checking?

Разбор темы

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

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

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

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

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