Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Spring: dto, entity, persistence, api

Использование DTO вместо сущностей

Оценивает знание проблем передачи персистентных сущностей в слои приложения.

Короткий ответ

DTO защищают от:

  1. Нечаянного изменения БД при обновлении сущности.

  2. Утечки конфиденциальных данных (например, паролей).

  3. Проблем ленивой загрузки (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 перед отправкой клиенту.

Уровень

  • Рейтинг:

    2

  • Сложность:

    5

Навыки

  • Spring

    Spring

Ключевые слова

#dto

#entity

#persistence

#api

Подпишись на Java Developer в телеграм