Java 尝试更新MongoDB SpringBoot中对象的字段时出现重复密钥错误

Java 尝试更新MongoDB SpringBoot中对象的字段时出现重复密钥错误,java,spring,mongodb,spring-boot,Java,Spring,Mongodb,Spring Boot,我正在尝试更新对象上的字段,然后尝试保存它。在将被调用的控制器中,代码如下所示 ApplicationUser user = applicationUserRepository.findByVerificationCode(verificationCode); if(user != null) { user.setVerified(true);//trying to change a value in a field applicationUserRepository.save(

我正在尝试更新对象上的字段,然后尝试保存它。在将被调用的控制器中,代码如下所示

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);
}
ApplicationUser user=applicationUserRepository.findByVerificationCode(验证代码);
如果(用户!=null){
user.setVerified(true);//尝试更改字段中的值
applicationUserRepository.save(用户);
返回新的ResponseEntity(用户,新的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;
    }       
}
公共类应用程序用户{
@身份证
私人长id;
私有字符串用户名;
私有字符串密码;
私有字符串名称;
私人字符串电子邮件;
私有字符串验证码;
私有布尔验证=假;
私人上市公司;
公共长getId(){
返回id;
}
公共字符串getUsername(){
返回用户名;
}
public void setUsername(字符串用户名){
this.username=用户名;
}
公共字符串getPassword(){
返回密码;
}
public void setPassword(字符串密码){
this.password=密码;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共字符串getEmail(){
回复邮件;
}
公用电子邮件(字符串电子邮件){
this.email=电子邮件;
}
公共字符串getVerificationCode(){
返回验证码;
}
public void setVerificationCode(字符串验证代码){
this.verificationCode=verificationCode;
}
公开上市公司(){
返回公司;
}
上市公司(上市公司){
this.boughtCompanies=boughtCompanies;
}
公共布尔值已验证(){
返回验证;
}
public void setVerified(布尔值已验证){
this.verified=verified;
}       
}
我在这里做错了什么,或者应该如何处理?谢谢。

编辑: 将@Id字段设置为字符串。在mongo中使用长值作为ID是不好的。 正如M.Wajdi所说,您需要将setter添加到id字段中


我看到您正在执行文档更新,因此应该使用applicationUserRepository.save()而不是applicationUserRepository.insert()。(实际上,我总是使用save)

说明:

Insert始终尝试在数据库中引入新对象。 第一次创建ApplicationUser时,insert将在DB中创建对象并为其分配一个ID。 但是如果您阅读、更新它并再次尝试插入它,Mongo将理解您实际上是在尝试引入具有相同ID的新对象(而不是在该对象中执行更新)。
这就是为什么会出现该异常,即重复密钥。

您尝试插入具有相同id的现有用户
函数insert我想你应该用update函数来更改它。你没有使用你的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;
    }       
}
公共类应用程序用户{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
私有字符串用户名;
私有字符串密码;
私有字符串名称;
私人字符串电子邮件;
私有字符串验证码;
私有布尔验证=假;
私人上市公司;
公共长getId(){
返回id;
}
公共字符串getUsername(){
返回用户名;
}
public void setUsername(字符串用户名){
this.username=用户名;
}
公共字符串getPassword(){
返回密码;
}
public void setPassword(字符串密码){
this.password=密码;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共字符串getEmail(){
回复邮件;
}
公用电子邮件(字符串电子邮件){
this.email=电子邮件;
}
公共字符串getVerificationCode(){
返回验证码;
}
public void setVerificationCode(字符串验证代码){
this.verificationCode=verificationCode;
}
公开上市公司(){
返回公司;
}
上市公司(上市公司){
this.boughtCompanies=boughtCompanies;
}
公共布尔值已验证(){
返回验证;
}
public void setVerified(布尔值已验证){
this.verified=verified;
}       
}
当选择long(或任何其他原语)作为mongo@Id时,您必须满足Id生成的需要,否则每次它都会给出long默认值,即0

有关自动增量排序,请参阅此处已回答的问题


Else make@Id of type String,mongo自动生成hexadeximal类型的默认Id,有关更多信息,请参阅

对不起,我从一开始就在使用save,但仍然收到了相同的错误。我试着插入,但同样的问题。我还更新了问题,能否附上applicationUserRepository的代码?此外,您可以尝试将@Id字段从long改为String。客户端生成的Id通常是字符串格式的UUID。非常感谢。我正在使用“保存”,但仍然收到相同的错误。必须生成用户id