JPA Many To Many Duplicate record in join table

来源:互联网 发布:cnstorm知乎 编辑:程序博客网 时间:2024/06/14 00:25

在使用JPA 进行多对多关系处理的时候,会出现中间表插入多条重复数据的问题


其实原因很简单,把多对多的结合对象换成Set就可以解决,如果用List就会造成重复记录的问题


附上代码:

@Entity
@Table(name = "groups")
public class Group extends BaseEntity {


private static final long serialVersionUID = 769557656518557214L;


private Brief brief;
private User owner;
private Set<User> members;


public Group() {
members = new HashSet<User>();
}


@OneToOne
@JoinColumn(name = "user_id")
public User getOwner() {
return owner;
}


public void setOwner(User owner) {
this.owner = owner;
}


@ManyToMany(mappedBy = "groups", fetch = FetchType.EAGER)
public Set<User> getMembers() {
return members;
}


public void setMembers(Set<User> members) {
this.members = members;
}


@Embedded
@AttributeOverrides({ @AttributeOverride(name = "name", column = @Column(name = "name") ),
@AttributeOverride(name = "description", column = @Column(name = "description") ) })
public Brief getBrief() {
return brief;
}


public void setBrief(Brief brief) {
this.brief = brief;
}


public Group addMembers(User user) {
this.members.add(user);
return this;
}
}




@Entity
@Table(name = "users", uniqueConstraints = { @UniqueConstraint(columnNames = { "name" }) })
public class User extends BaseEntity {


private static final long serialVersionUID = 531034985278921408L;


private String name;
private String password;
private String displayName;
private String headImgUrl;
private UploadFile headImg;
private UploadFile backgroundImg;
private String identifyNo;
private String phoneNo;
private Date dob;
private boolean male;
private boolean married;
private String roles;
private Value personHeight = new Value();
private Value personWeight = new Value();


private Device device;
private Section section;


@Exclude
@JsonIgnore
private Set<Group> groups;


public User() {
groups = new HashSet<Group>();
}


public String getName() {
return name;
}


public void setName(String name) {
this.name = name;
}


public String getPassword() {
return password;
}


public void setPassword(String password) {
this.password = password;
}


public String getDisplayName() {
return displayName;
}


public void setDisplayName(String displayName) {
this.displayName = displayName;
}


@OneToOne
@JoinColumn(name = "file_id")
public UploadFile getHeadImg() {
return headImg;
}


public void setHeadImg(UploadFile headImg) {
this.headImg = headImg;
}


public String getIdentifyNo() {
return identifyNo;
}


public void setIdentifyNo(String identifyNo) {
this.identifyNo = identifyNo;
}


public String getPhoneNo() {
return phoneNo;
}


public void setPhoneNo(String phoneNo) {
this.phoneNo = phoneNo;
}


public Date getDob() {
return dob;
}


public void setDob(Date dob) {
this.dob = dob;
}


public boolean isMale() {
return male;
}


public void setMale(boolean male) {
this.male = male;
}


public boolean isMarried() {
return married;
}


public void setMarried(boolean married) {
this.married = married;
}


public String getRoles() {
return roles;
}


public void setRoles(String roles) {
this.roles = roles;
}


@ManyToOne
@JoinColumn(name = "device_id")
public Device getDevice() {
return device;
}


public void setDevice(Device device) {
this.device = device;
}


@ManyToOne
@JoinColumn(name = "section_id")
public Section getSection() {
return section;
}


public void setSection(Section section) {
this.section = section;
}


public String getHeadImgUrl() {
return headImgUrl;
}


public void setHeadImgUrl(String headImgUrl) {
this.headImgUrl = headImgUrl;
}


@Embedded
@AttributeOverrides({ @AttributeOverride(name = "amount", column = @Column(name = "h_amount") ),
@AttributeOverride(name = "unit", column = @Column(name = "h_unit") ) })
public Value getPersonHeight() {
return personHeight;
}


public void setPersonHeight(Value personHeight) {
this.personHeight = personHeight;
}


@Embedded
@AttributeOverrides({ @AttributeOverride(name = "amount", column = @Column(name = "w_amount") ),
@AttributeOverride(name = "unit", column = @Column(name = "w_unit") ) })
public Value getPersonWeight() {
return personWeight;
}


public void setPersonWeight(Value personWeight) {
this.personWeight = personWeight;
}


@OneToOne
@JoinColumn(name = "background_img_id")
public UploadFile getBackgroundImg() {
return backgroundImg;
}


public void setBackgroundImg(UploadFile backgroundImg) {
this.backgroundImg = backgroundImg;
}


@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "group_user_relation", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = {
@JoinColumn(name = "group_id") }, uniqueConstraints = {
@UniqueConstraint(columnNames = { "user_id", "group_id" }) })
public Set<Group> getGroups() {
return groups;
}


public void setGroups(Set<Group> groups) {
this.groups = groups;
}


public User addGroups(Group group) {
this.groups.add(group);
return this;
}
}

0 0
原创粉丝点击