问题描述
调用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
表,该条目将消失。
1楼
您总是在创建一个新实体并将其保存(在toEntity()方法中,该方法实际上会覆盖先前的实体。
如果要更新现有用户,则需要对其字段进行获取+更新 ,然后调用保存。
例如,这将更新现有用户的名称:
UserEntity userEntity = userRepository.findOneById(existingUser.getId())
userEntity.setName(newName);
userRepository.save(userEntity);
您也不应手动设置实体的ID。 利用@Id和@GeneratedValue。