我正在尝试构建一个具有一些基本电子商务功能的小型Spring Boot CRUD应用程序(即添加到购物车等)。我的基本实体是客户,奶酪和角色。
在尝试将顾客映射到奶酪时,只有一个用户可以完美地运作。 A"顾客奶酪" table是使用customer accountNumber(id)以及Cheese id生成的。这是表格的图片:
但是,在尝试使用其他帐户添加项目时,我收到如下错误:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: 重复输入' 6'关键' UK_pg95jxw3noahgyna6qwbl3ivd'
我假设这只是意味着我只能拥有一个奶酪ID。我试图使用不同的hibernate注释(即@ElementCollection,@ manytomany等),但是无法使其工作。
任何输入都将不胜感激。另外,如果您需要我的任何服务或控制器,请告诉我,但实际添加和删除在我的应用程序中正常工作。
客户
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;
}
}
答案 0 :(得分:0)
嗯...所以,我通过以下方式让它工作:我将电子邮件更改为customer_id,这无疑应该没有什么区别。对于奶酪类,我做了很多很多的“mapBy”奶酪。
同样,我不确定为什么会这样,而另一个则不然,但似乎就是这种情况。
<强>客户强>
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;
}
}