CrudRepository:保存方法删除条目

4

调用CrudRepository.save()方法时,会删除现有条目而不是更新现有条目。

控制器:

@RequestMapping(value = "{id}", method = PATCH)   
public User update(@PathVariable Long id, @RequestBody UpdateUser existingUser) {
  return userService.update(existingUser);
}

Service:

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”表,该条目将被删除。"最初的回答"。
2个回答

3

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

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

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

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

你也不应该手动设置实体的ID。使用@Id和@GeneratedValue注解来优化。

没问题,我明白了。我需要找到一种更优雅的方法来在DTO和实体之间进行转换。 - Sterling Duchess

0

我曾经遇到过同样的问题,这篇帖子帮助了我。 不要使用构建器模式构造新实体。

MovieEntity movieEntity = MovieEntity.builder()
    .id(uuid)
    .scene(movie.getScene())
    .imageUrl(movieEntityOptional.get().getImageUrl())
    .build();

我不得不重复使用并保存从repository.findById()获取的相同内容

MovieEntity movieEntity = movieEntityOptional.get();
movieEntity.setId(uuid);
movieEntity.setScene(movie.getScene());
movieEntity.setImageUrl(movieEntityOptional.get().getImageUrl());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接