有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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 duplicate key error index: myapp.applicationUser.$id dup key: { : 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;
    }       
}

我在这里做错了什么,或者应该如何处理?谢谢


共 (4) 个答案

  1. # 1 楼答案

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


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

    说明:

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

  2. # 2 楼答案

    您尝试插入具有相同id的现有用户 函数insert我想你应该用函数update来改变它

  3. # 4 楼答案

    您没有使用ID的setter,因此需要将其设置为自动增量

    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;
        }       
    }