CrudRepository:保存方法删除条目

时间:2019-02-13 10:47:23

标签: java spring spring-boot spring-data-jpa

调用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 个答案:

答案 0 :(得分:1)

您总是在创建一个新实体并将其保存(在您的toEntity()方法中,该方法实际上会覆盖先前的实体。

如果要更新现有用户,则需要在其字段上进行获取并更新,然后调用保存。

例如,这将更新现有用户的名称:

UserEntity userEntity = userRepository.findOneById(existingUser.getId())
userEntity.setName(newName);
userRepository.save(userEntity);

您也不应手动设置实体的ID。杠杆@Id 和@GeneratedValue。