Java Spring会更新而不是保存
我试图用R2DBC编写一个反应式后端代码,但遇到了一件我并不真正理解的事情。我不知道为什么,但是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;
@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; }