当前位置: 代码迷 >> java >> CrudRepository:保存方法删除条目
  详细解决方案

CrudRepository:保存方法删除条目

热度:51   发布时间:2023-07-31 11:15:36.0

调用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表,该条目将消失。

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

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

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

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

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