我正在尝试使用 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/