Добавить 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 шт):
Вы должны иметь понимание, что такое слои в SOA(сервис-оринетированная архитектура).
Понимать для чего нужны DTO (это контейнеры для передачи данных между слоем бизнес-логики (Service layer) и слоем доступа к базе данных (DAO). Также из контейнера DTO данные для возврата ответа клиенту сериализуются (например, используется JAKSON) и отправляются клиенту. Когда запрос приходит, происходит десериализация данных и они перекладываются в DTO-объект. Трансформация (перевод из DTO в Entity и обратно) - должна происходить на Service layer.
Понимать, что Hibernate это поставщик ORM-системы.
Понимать, что такое JPA (это ряд правил и рекомендаций (в общем смысле), который обязывает стандартизировать различные фреймворки ORM-систем), что позволяет не делая почти никаких изменений в коде, подключать различных вендоров ORM-систем).
Понимать как происходит генерация id, для сущности, которая готовится для сериализации в базу данных.
Понимать, что такое сериализация и десериализация в плоскости работы вашего приложения.
Id может даже формироваться вашим приложением (например, 16-х значной строкой - тип UUID)
Важно понимать что такое Persistence context, в рамках Hibernate.
@Entity
@Table(name = "product")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
Это лишь малая часть настройки. Важно понимать, как это работает на самом деле (есть отличия в настройке ID, для разных поставщиков JDBC API).
- Для передачи данных между Dto и Entity нужны трансформеры, один из таких - MapStruct.
В нем отсутствуют поля такие как id, roles и т.д
При создании записи в базе данных, какая та часть данных предоставляется клиентом, который делает запрос на сохранения данных в базу данных, а какая то часть будет заполнена вашим приложением, например, набор ролей : В DTO будет указан список ролей доступа к системе, для текущей записи, а ваше приложение, полученную информацию может преобразовать, например, загрузив список возможных "ролей доступа", сформировать для текущего запроса роли доступа в соответсвии с форматом, как это должно быть сохранено в базе данных. Если вы учитесь, то спросите преподавателя - как это сделать. Если стажируетесь, то ментор должен это все разъяснить.
На ваш вопрос, однозначный ответ не стоит давать. Вы должны разобраться в том, что делаете. Не получится просто подставлять шаблонный код и программировать, нужно понимать смысл того, как фреймоворки "за кулисами" выполняют поставленные задачи, это поможет быстрее найти ошибки, в случае сбоя системы.