Можете ли вы показать лучший способ сохранить два объекта в базе данных?
Я думаю, что мой код ужасен.
Я получаю DTO с двумя сущностями (между ними отношение один к одному).
Я проверяю поля в этих объектах. Если я получаю ошибку, я не должен ничего сохранять.
Моя логика:
1. Мне нужно сохранить первую сущность;
2. Установите идентификатор от первого объекта ко второму объекту; (Я получу идентификатор, если сохраню сущность. Вот почему я не могу сделать это мгновенно)
3. Сохраните второй объект.
4. Если я получаю сообщение об ошибке, я удаляю первый сохраненный объект.
@PostMapping()
public ResponseEntity<?> create(@Valid @RequestBody DTOClient dtoClient) {
ResponseEntity<?> responseEntity = new ResponseEntity<>(HttpStatus.BAD_REQUEST);
Optional<Client> clientFromDB = Optional.empty();
Optional<Skill> skillFromDB = Optional.empty();
try{
clientFromDB = Optional.ofNullable(this.clientService.save(dtoClient.getClient()));
dtoClient.getSkill().setClient(clientFromDB.get());
skillFromDB = Optional.ofNullable(this.skillService.save(dtoClient.getSkill()));
if (clientFromDB.isPresent() && skillFromDB.isPresent()) {
responseEntity = new ResponseEntity<>( HttpStatus.OK);
}
}catch (RuntimeException ex){
clientService.deleteById(clientFromDB.get().getId());
}
return responseEntity;
}
Спасибо за помощь!
Обновить.
Теперь мне не нужно проверять это исключение.
Когда я это делаю, я вижу два запроса на вставку в базу данных. Это правильно?
Могу ли я сделать это одним запросом?
dtoClient().getSkill().setClient(dtoClient().getClient())
skillFromDB = Optional.ofNullable(this.skillService.save(dtoClient.getSkill()));