Вопрос с собеседования · Базы данных

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

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

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

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

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

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

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

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

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

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