Почему для эндпоинта, отдающего список из тысяч записей, обычно предпочитают проекцию в DTO, а не загрузку сущностей?
- Зачем использовать 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?
Разбор темы
- ORM, persistence context и N+1
Что делает ORM, lazy/eager и proxy, механизм N+1, способы лечения и типичные грабли.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.