代码之家  ›  专栏  ›  技术社区  ›  user2411290

Spring Boot:尝试将客户映射到项时出现MySQL重复键错误

  •  0
  • user2411290  · 技术社区  · 6 年前

    在尝试将客户映射到奶酪的过程中,它只对一个用户运行得非常好。生成一个“customer cheeses”表,其中包含customer accountNumber(id)和Cheese id。下面是该表的图片:

    MySQL table

    com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:异常: 键“UK pg95jxw3noahgyna6qwbl3ivd”的重复条目“6”

    如有任何意见,将不胜感激。另外,如果您需要我的任何服务或控制器,请告诉我,但实际添加和删除在我的应用程序中运行良好。

    package com.example.demo.models;
    
    import javax.persistence.*;
    import javax.validation.constraints.Email;
    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Size;
    import java.io.Serializable;
    import java.math.BigDecimal;
    import java.util.ArrayList;
    import java.util.List;
    
    @Entity
    public class Customer implements Serializable {
    
        @NotNull
        @Size(min = 2, max = 25)
        private String name;
    
        @GeneratedValue
        @Id
        private int accountNumber;
    
        private BigDecimal accountFunds;
    
        @NotNull
        @Size(min = 2)
        private String password;
    
        @NotNull
        @Size(min = 2, max = 25)
        @Email
        private String email;
    
        @ManyToMany(cascade=CascadeType.ALL)
        @JoinTable(name="user_roles",
                joinColumns={@JoinColumn(name="CUSTOMER_EMAIL", referencedColumnName = "email")},
                inverseJoinColumns={@JoinColumn(name="ROLE_ID", referencedColumnName="id")})
        private List<Role> roles;
    
        @ElementCollection
        private List<Cheese> cheeses = new ArrayList<>();
    
    
        public Customer(String name, String password, String email) {
            this.name = name;
            this.password = password;
            this.email = email;
            this.accountFunds = new BigDecimal(225.00); // default value
        }
    
        public Customer() {}
    
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAccountNumber() {
            return accountNumber;
        }
    
        public List<Role> getRoles() {
            return roles;
        }
    
        public void setRoles(List<Role> roles) {
            this.roles = roles;
        }
    
        public BigDecimal getAccountFunds() {
            return accountFunds;
        }
    
        public void setAccountFunds(BigDecimal accountFunds) {
            this.accountFunds = accountFunds;
        }
    
        public List<Cheese> getCheeses() {
            return cheeses;
        }
    
        public void setCheeses(List<Cheese> cheeses) {
            this.cheeses = cheeses;
        }
    }
    

    奶酪

    package com.example.demo.models;
    
    import javax.persistence.*;
    import javax.validation.constraints.DecimalMax;
    import javax.validation.constraints.DecimalMin;
    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Size;
    import java.math.BigDecimal;
    import java.util.ArrayList;
    import java.util.List;
    
    @Entity
    public class Cheese {
    
        @NotNull
        @Size(min=2, max=20)
        private String name;
    
    
        @NotNull
        @Size(min=2, max=20)
        private String description;
    
        @NotNull
        @DecimalMax("10000.0") @DecimalMin("0.0")
        private BigDecimal price;
    
        @Id
        @GeneratedValue
        private int id;
    
        @ManyToMany
        private List<Customer> customers = new ArrayList<>();
    
        public Cheese() {}
    
        public Cheese(String name, String description, BigDecimal price) {
            this.name = name;
            this.description = description;
            this.price = price;
        }
    
        public BigDecimal getPrice() {
            return price;
        }
    
        public void setPrice(BigDecimal price) {
            this.price = price;
        }
    
        public int getId() {
            return id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getDescription() {
            return description;
        }
    
        public void setDescription(String description) {
            this.description = description;
        }
    
    }
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   user2411290    6 年前

    嗯…所以,我做了如下的工作:我把电子邮件改成了客户id,这当然没什么区别。在奶酪课上,我做了许多对许多的“地图小贩”奶酪。

    再说一次,我不知道为什么这样做,而另一个没有,但似乎是这样。

    package com.example.demo.models;
    
    import javax.persistence.*;
    import javax.validation.constraints.Email;
    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Size;
    import java.io.Serializable;
    import java.math.BigDecimal;
    import java.util.ArrayList;
    import java.util.List;
    
    @Entity
    public class Customer implements Serializable {
    
    @NotNull
    @Size(min = 2, max = 25)
    private String name;
    
    @GeneratedValue
    @Id
    private int accountNumber;
    
    private BigDecimal accountFunds;
    
    @NotNull
    @Size(min = 2)
    private String password;
    
    @NotNull
    @Size(min = 2, max = 25)
    @Email
    private String email;
    
    @ManyToMany(cascade=CascadeType.ALL)
    @JoinTable(name="user_roles",
            joinColumns={@JoinColumn(name="CUSTOMER_EMAIL", referencedColumnName = "email")},
            inverseJoinColumns={@JoinColumn(name="ROLE_ID", referencedColumnName="id")})
    private List<Role> roles;
    
    //@ElementCollection
    
    @ManyToMany(cascade=CascadeType.ALL)
    @JoinTable(name="cheese_customers",
            joinColumns={@JoinColumn(name="CUSTOMER_ID", referencedColumnName = "accountNumber")},
            inverseJoinColumns={@JoinColumn(name="PRODUCT_ID", referencedColumnName="id")})
    private List<Cheese> cheeses = new ArrayList<>();
    
    
    public Customer(String name, String password, String email) {
        this.name = name;
        this.password = password;
        this.email = email;
        this.accountFunds = new BigDecimal(225.00);
    }
    
    public Customer() {}
    
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getEmail() {
        return email;
    }
    
    public void setEmail(String email) {
        this.email = email;
    }
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAccountNumber() {
        return accountNumber;
    }
    
    public List<Role> getRoles() {
        return roles;
    }
    
    public void setRoles(List<Role> roles) {
        this.roles = roles;
    }
    
    public BigDecimal getAccountFunds() {
        return accountFunds;
    }
    
    public void setAccountFunds(BigDecimal accountFunds) {
        this.accountFunds = accountFunds;
    }
    
    public List<Cheese> getCheeses() {
        return cheeses;
    }
    
    public void setCheeses(List<Cheese> cheeses) {
        this.cheeses = cheeses;
    }
    }
    

    奶酪

    package com.example.demo.models;
    
    import javax.persistence.*;
    import javax.validation.constraints.DecimalMax;
    import javax.validation.constraints.DecimalMin;
    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Size;
    import java.math.BigDecimal;
    import java.util.ArrayList;
    import java.util.List;
    
    @Entity
    public class Cheese {
    
        @NotNull
        @Size(min=2, max=20)
        private String name;
    
    
        @NotNull
        @Size(min=2, max=20)
        private String description;
    
        @NotNull
        @DecimalMax("10000.0") @DecimalMin("0.0")
        private BigDecimal price;
    
        @Id
        @GeneratedValue
        private int id;
    
    
        @ManyToMany(mappedBy = "cheeses")
        private List<Customer> customers = new ArrayList<>();
    
        public Cheese() {}
    
        public Cheese(String name, String description, BigDecimal price) {
            this.name = name;
            this.description = description;
            this.price = price;
        }
    
        public BigDecimal getPrice() {
            return price;
        }
    
        public void setPrice(BigDecimal price) {
            this.price = price;
        }
    
        public int getId() {
            return id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getDescription() {
            return description;
        }
    
        public void setDescription(String description) {
            this.description = description;
        }
    }