Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
На самом деле можно реализовать еще проще: как Optional + Jackson ObjectMapper для простого частичного обновления сущности из ДТО.
У меня есть подробный пример реализации метода PATCH при помощи такого подхода здесь https://github.com/ololx/restful-updating-instances; если Вам будет интересно.
В Вашем случае, это может выглядеть так:
Сущность (без аннотаций Hibernate):
public class UserModel {
private long id;
@JsonProperty("login")
private String login;
@JsonProperty("first_name")
private String firstName;
@JsonProperty("last_name")
private String lastName;
@JsonProperty("birth_date")
private String birthDate;
@JsonProperty("email")
private String email;
@JsonProperty("phone_number")
private String phoneNumber;
}ДТО для этой сущности:
@JsonInclude(JsonInclude.Include.NON_NULL)
public class UserDetail {
@JsonProperty("login")
private Optional<String> login;
@JsonProperty("first_name")
private Optional<String> firstName;
@JsonProperty("last_name")
private Optional<String> lastName;
@JsonProperty("birth_date")
private Optional<String> birthDate;
@JsonProperty("email")
private Optional<String> email;
@JsonProperty("phone_number")
private Optional<String> phoneNumber;
}Кусок реализации метода PATCH:
@SneakyThrows
@PatchMapping(
path = "/{id}"
)
public UserDetail update(
@ApiParam(
name="id",
value = "The update user entity id",
required = true
) @PathVariable Long id,
@ApiParam(
name="updateUserRequest",
value = "The update user request",
required = true
) @RequestBody UserDetail updateUserRequest) {
UserModel user = this.userRepository.findById(id).orElse(null);
assertNotNull(user, String.format("User with id - {} is not existed", id));
objectMapper.updateValue(user, updateUserRequest);
this.userRepository.save(user);
UserDetail updateUserResponse = new UserDetail();
objectMapper.updateValue(updateUserResponse, user);
return updateUserResponse;
}Где userRepository — обычный JpaRepository; а objectMapper — стандартный ObjectMapper.
@Autowired
PersonRepository peopleRepository;
@Autowired
ObjectMapper objectMapper;Я пытаюсь повысить удобство проброса изменяемых данных через слои приложения. Маппинг из DTO в модель, из модели в сущность.
Ну и, если это bulk update операция, то произвести ее за одну SQL операцию.
А может вам не надо столько слоев? Раз экономить их хочется?
Partial Update library. Частичное обновление сущности в Java Web Services