我正在尝试更新对象上的字段,然后尝试保存它。在将被调用的控制器中,代码就是这样。
ApplicationUser user = applicationUserRepository.findByVerificationCode(verificationCode);
if(user != null) {
user.setVerified(true);//trying to change a value in a field
applicationUserRepository.save(user);
return new ResponseEntity<>(user,new HttpHeaders(),HttpStatus.OK);
}
当我尝试执行此代码时,出现此错误
E11000重复密钥错误索引:myapp.applicationUser。$ id 重复密钥:{:0};
我在ApplicationUser类中明确定义了ID。 我的ApplicationUser类是这样的
public class ApplicationUser {
@Id
private long id;
private String username;
private String password;
private String name;
private String email;
private String verificationCode;
private boolean verified=false;
private List<Company> boughtCompanies;
public long getId() {
return id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getVerificationCode() {
return verificationCode;
}
public void setVerificationCode(String verificationCode) {
this.verificationCode = verificationCode;
}
public List<Company> getBoughtCompanies() {
return boughtCompanies;
}
public void setBoughtCompanies(List<Company> boughtCompanies) {
this.boughtCompanies = boughtCompanies;
}
public boolean isVerified() {
return verified;
}
public void setVerified(boolean verified) {
this.verified = verified;
}
}
我在这里做错了什么或应该如何处理?谢谢。
答案 0 :(得分:0)
编辑: 将@Id字段设置为String。在mongo中将long值用作ID不好。 就像M. Wajdi所说的那样,您需要将setter添加到id字段中。
我看到您正在执行文档更新,因此应使用applicationUserRepository.save()而不是applicationUserRepository.insert()。 (实际上,我总是使用保存)。
说明:
插入总是尝试在数据库中引入新对象。 首次创建ApplicationUser时,insert在数据库中创建对象并为其分配ID。 但是,如果您阅读,更新并尝试再次插入它,Mongo将会理解您实际上是在尝试引入具有相同ID的新对象(而不是对该对象执行更新)。 这就是为什么您会收到该异常(重复的密钥)的原因。
答案 1 :(得分:0)
您尝试插入具有相同ID的现有用户 函数插入,我认为您应该使用更新功能
进行更改答案 2 :(得分:0)
您没有使用ID的设置器,因此需要将其设置为自动增量
public class ApplicationUser {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String username;
private String password;
private String name;
private String email;
private String verificationCode;
private boolean verified=false;
private List<Company> boughtCompanies;
public long getId() {
return id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getVerificationCode() {
return verificationCode;
}
public void setVerificationCode(String verificationCode) {
this.verificationCode = verificationCode;
}
public List<Company> getBoughtCompanies() {
return boughtCompanies;
}
public void setBoughtCompanies(List<Company> boughtCompanies) {
this.boughtCompanies = boughtCompanies;
}
public boolean isVerified() {
return verified;
}
public void setVerified(boolean verified) {
this.verified = verified;
}
}
答案 3 :(得分:0)
在选择long(或其他任何原始类型)作为mongo @Id时,则必须迎合id的生成,否则每次它将提供long的默认值,即0
有关自动增量排序的信息,请参见Auto increment sequence in mongodb using java。
其他类型为String的@Id,mongo自动生成十六进制类型的默认ID,有关更多信息,请参考https://docs.mongodb.com/manual/reference/method/ObjectId/