调用CrudRepository.save()
方法将删除条目,而不是更新现有条目。
控制器:
@RequestMapping(value = "{id}", method = PATCH)
public User update(@PathVariable Long id, @RequestBody UpdateUser existingUser) {
return userService.update(existingUser);
}
服务:
public User update(UpdateUser existingUser) {
if (!userRepository.exists(existingUser.getId()) {
throw new UserNotFoundException();
}
UserEntity userEntity = existingUser.toEntity();
return userRepository.save(userEntity).toDto();
}
Dtos:
public User {
private Long id;
private String name;
// ..
public UserEntity toEntity() {
UserEntity entity = new UserEntity();
entity.setId(id);
entity.setName(name);
return entity;
}
}
public UpdateUser extends User {
@NotNull
@Override
public Long getId() {
super.getId();
}
}
我确保控制器和服务收到的Dto上设置了ID,并且更新后它仍然相同。无论如何,服务update
方法似乎可以保存和删除实体。因为我得到了从save
方法返回的实体创建的dto,所以可以看到更改后的名称。但是,如果刷新页面或查看users
表,该条目将消失。
答案 0 :(得分:1)
您总是在创建一个新实体并将其保存(在您的toEntity()方法中,该方法实际上会覆盖先前的实体。
如果要更新现有用户,则需要在其字段上进行获取并更新,然后调用保存。
例如,这将更新现有用户的名称:
UserEntity userEntity = userRepository.findOneById(existingUser.getId())
userEntity.setName(newName);
userRepository.save(userEntity);
您也不应手动设置实体的ID。杠杆@Id 和@GeneratedValue。