首页 > 解决方案 > Spring 更新而不是保存

问题描述

我正在尝试使用 R2DBC 编写一个小的反应式后端并遇到我不太了解的事情。我不知道为什么,但 Spring 正在尝试更新条目而不是将其保存到数据库中。

我的用户模型:

@Table("user")
@NoArgsConstructor
@Data
public class User {

    @Id
    private String id;

    private String username;
    private String password;

    public User(String id,String username,String password){
        this.id = id;
        this.username = username;
        this.password=password;
    }

我的控制器:

@RestController
    public class UserController {

`   private final UserRepository userRepository`;

    @Autowired
    public UserController(UserRepository userRepository){

        this.userRepository = userRepository;
    }

    @PostMapping("/create")
        public Mono<User> createUser(@RequestBody User user){
            return userRepository.save(user);
        }   

当我使用这样的输入向此端点发送 POST 请求时,例如:

{“id”:“re”,“用户名”:“ehmmidk”,“密码”:“dsadsadsadsa”}

即使我的数据库中没有条目,它也会更新保存。

我的架构如下所示:

CREATE TABLE user (
   id VARCHAR(255) NOT NULL ,
   username VARCHAR(255) NOT NULL,
   password VARCHAR(255) NOT NULL,


   PRIMARY KEY (id),
   UNIQUE(username)
);

标签: javaspringspring-data-r2dbc

解决方案


原因可能是您发布了一个带有预填充的实体id

{ "id" : "re", "username" : "ehmmidk", "password" : "dsadsadsadsa" }

我发现如果一个声明的实体正在实现Persistable接口,它必须实现isNew()定义行为的方法repository.save()——它会触发一个INSERT还是一个UPDATE.

我看到在你的情况下你没有实现Persistable也许默认行为是

boolean isNew() { return id == null; }

在您的情况下,这可能意味着该实体被 Spring 数据 r2dbc 视为不是新的,这就是它生成UPDATE.

然而,这只是我的猜测。


推荐阅读