Оценивает знание проблем передачи персистентных сущностей в слои приложения.
DTO защищают от:
Нечаянного изменения БД при обновлении сущности.
Утечки конфиденциальных данных (например, паролей).
Проблем ленивой загрузки (LazyInitializationException).
Проблемы прямого возврата сущностей:
Изменение БД: Если контроллер принимает сущность Book из запроса и сохраняет её, злоумышленник может передать поля, которые не должны обновляться (например, price).
Ленивая загрузка: При возврате Author с ленивым списком books возникнет ошибка, когда Hibernate попытается загрузить книги вне транзакции:
@Entity
public class Author {
@OneToMany(fetch = FetchType.LAZY)
private List<Book> books; // При сериализации - LazyInitializationException
}Решение через DTO:
public record BookDTO(String title, String authorName) {} // Только нужные поля
public class BookService {
public BookDTO getBook(Long id) {
Book book = bookRepository.findById(id);
return new BookDTO(book.getTitle(), book.getAuthor().getName());
}
}Преимущества:
Контролируемая сериализация.
Отделение слоя БД от API.
Защита от перегрузки данных (например, исключение поля content из DTO).
Вывод: Всегда преобразуйте сущности в DTO перед отправкой клиенту.