Добавить id для dto

Есть рест контроллер:

@RestController
@RequestMapping("/api/v1/users")
@RequiredArgsConstructor
public class UserController {

    private final UserServiceImpl userService;

    @PostMapping(value = "/create", consumes = "application/json")
    public void create(@RequestBody UserCreateRequestDto userDto) {
        userService.create(userDto);
    }
}

Метод принимает dto объект. В нем отсутствуют поля такие как id, roles и т.д

Как преобразовать в доменный класс, чтобы hibernate сам назначил ему айдишник и прочее?


Ответы (1 шт):

Автор решения: skyho
  1. Вы должны иметь понимание, что такое слои в SOA(сервис-оринетированная архитектура).

  2. Понимать для чего нужны DTO (это контейнеры для передачи данных между слоем бизнес-логики (Service layer) и слоем доступа к базе данных (DAO). Также из контейнера DTO данные для возврата ответа клиенту сериализуются (например, используется JAKSON) и отправляются клиенту. Когда запрос приходит, происходит десериализация данных и они перекладываются в DTO-объект. Трансформация (перевод из DTO в Entity и обратно) - должна происходить на Service layer.

  3. Понимать, что Hibernate это поставщик ORM-системы.

  4. Понимать, что такое JPA (это ряд правил и рекомендаций (в общем смысле), который обязывает стандартизировать различные фреймворки ORM-систем), что позволяет не делая почти никаких изменений в коде, подключать различных вендоров ORM-систем).

  5. Понимать как происходит генерация id, для сущности, которая готовится для сериализации в базу данных.

  6. Понимать, что такое сериализация и десериализация в плоскости работы вашего приложения.

  7. Id может даже формироваться вашим приложением (например, 16-х значной строкой - тип UUID)

  8. Важно понимать что такое Persistence context, в рамках Hibernate.


     @Entity
     @Table(name = "product")
     public class Product {

     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;

Это лишь малая часть настройки. Важно понимать, как это работает на самом деле (есть отличия в настройке ID, для разных поставщиков JDBC API).

  1. Для передачи данных между Dto и Entity нужны трансформеры, один из таких - MapStruct.

В нем отсутствуют поля такие как id, roles и т.д

При создании записи в базе данных, какая та часть данных предоставляется клиентом, который делает запрос на сохранения данных в базу данных, а какая то часть будет заполнена вашим приложением, например, набор ролей : В DTO будет указан список ролей доступа к системе, для текущей записи, а ваше приложение, полученную информацию может преобразовать, например, загрузив список возможных "ролей доступа", сформировать для текущего запроса роли доступа в соответсвии с форматом, как это должно быть сохранено в базе данных. Если вы учитесь, то спросите преподавателя - как это сделать. Если стажируетесь, то ментор должен это все разъяснить.

На ваш вопрос, однозначный ответ не стоит давать. Вы должны разобраться в том, что делаете. Не получится просто подставлять шаблонный код и программировать, нужно понимать смысл того, как фреймоворки "за кулисами" выполняют поставленные задачи, это поможет быстрее найти ошибки, в случае сбоя системы.

→ Ссылка