java - Spring 更新而不是保存

标签 java spring spring-data-r2dbc

我正在尝试使用 R2DBC 编写一些响应式(Reactive)后端代码,但遇到了一个我不太了解的问题。我不知道为什么,但 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;
    }

我的 Controller :

@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”:“重新”, “用户名”:“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)
);

最佳答案

原因可能是您发布的实体具有预填充的 id:

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

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

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

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

在您的情况下,这可能意味着该实体被 Spring 数据 r2dbc 视为不是新实体,这就是它进行 UPDATE 的原因。

但这只是我的猜测。

关于java - Spring 更新而不是保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64030718/

相关文章:

java - 来自不同 JAR 的 Spring Bean XML 声明

java - Jackson - 将内部对象列表反序列化为更高级别的列表

java - 不允许多重继承时如何避免代码重复?

java - 如何使用 oAuth2/spring security 限制一个连接/用户

java - 如何使用 Spring 中 R2dbc 提供的 Mono<Connection> 或 DatabaseClient 处理可为 null 的字段?

java - 相当于 Spring Data 的 ReactiveCrudRepository 和 R2DBC 的 DataJpaTest

kotlin - 实现两个id接口(interface)时如何解决冲突?

java - JNI HellowWorld unsatisfiedlinkError 找不到依赖库

java - 如何测试调用另一个类方法的方法?

java - @Autowiring 在现场级别不起作用