Java Spring会更新而不是保存

Java Spring会更新而不是保存,java,spring,spring-data-r2dbc,Java,Spring,Spring Data R2dbc,我试图用R2DBC编写一个反应式后端代码,但遇到了一件我并不真正理解的事情。我不知道为什么,但是Spring正在尝试更新条目,而不是将其保存到数据库中 我的用户模型: @Table("user") @NoArgsConstructor @Data public class User { @Id private String id; private String username; private String password;

我试图用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);
        }   

似乎您忘记了为实体类用户使用注释
@Entity

@Entity&@GeneratedValue应添加到pojo中

@GeneratedValue将有助于定义生成主键值的策略(如标识/顺序)


如果可能,请提供控制台中打印的更新sql查询以供进一步分析。

您需要添加
@GeneratedValue(strategy=GenerationType.IDENTITY)
。Spring的Crud存储库没有create和update方法,只有save(另请参见
saveAndFlush
)。它通过
@id
处理创建和更新,因此如果
id
字段存在,它将执行更新检查my,以了解即将推出的Spring Boot 2.4、Spring 5.3和Spring数据R2dbc 1.2

在这个例子中,我使用Postpres。它使用ApplicationRunner将一些示例数据初始化到数据库中

保存实体时,您将id设置为非null值,可能Spring数据R2dbc使用它来检查实体是否是新的


但是,您可以使用R2dbc
DatabaseClient手动插入数据,以按预期执行SQL查询,请检查此处(但我在此处使用了数据库生成的id)。

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

{ "id" : "re", "username" : "ehmmidk", "password" : "dsadsadsadsa" }
我发现的是,如果一个声明的实体正在实现
Persistable
接口,那么它必须实现
isNew()
方法,该方法定义
存储库的行为。save()
-它会触发
插入
还是
更新

我看到在您的情况下,您没有实现
持久化
,但是可能,那么默认行为是

boolean isNew() { return id == null; }
这可能意味着在您的情况下,Spring数据r2dbc认为该实体不是新的,这就是它进行
更新的原因


但是这只是我的猜测。

R2DBC中没有注释实体,但我认为这不是问题所在。我使用的是R2DBC,我没有注入JPA依赖项,我必须注入该依赖项吗?不需要注入依赖项。如果不想更新该记录,请不要在json中提供id字段,然后再次尝试处理该字段。是否可以更新日志以包含存储库代码,如果使用JPA,则必须在实体类中声明实体注释
boolean isNew() { return id == null; }