数据库设计:good表(主键good_id),user表(主键user_id)
情况一:中间表user_good只有两个字段:good_id,user_id.
good与user只是多对多(manyToMany)的关系
注解形式的映射如下:
public class Good{
//被维护端
@ManyToMany(mappedBy = "goods")
private Set<User> goodList=new HashSet<User>();
public Set<User> getGoodList() {
return goodList;
}
public void setGoodList(Set<User> goodList) {
this.goodList = goodList;
}
}
public class User{
//维护端
@ManyToMany(cascade = CascadeType.PERSIST,fetch = FetchType.LAZY)
@JsonIgnore
@JoinTable(name="user_good",
joinColumns={@JoinColumn(name="user_id",referencedColumnName = "user_id")},
inverseJoinColumns={@JoinColumn(name="good_id",referencedColumnName="good_id")})
private Set<Good> goods=new HashSet<Good>();
public Set<Good> getGoods() {
return goods;
}
public void setGoods(Set<Good> goods) {
this.goods = goods;
}
}
情况二:实际开发过程中,中间表不仅仅两个字段:good_id,user_id,还有其他字段如(user_good_id,date 等),那么此时的对应关系如下:
- good与user_good是一对多的关系
- user 与user_good是一对多的关系
- user_good与good是多对一的关系
user_good与user是多对一的关系
注:由于我此处是
user_good与good是多对一的关系
user_good与user是多对一的关系,都属于单向关联。good,user端被维护,不做注解
实体注解形式的如下:
@Table(name = "user_good")
@Entity
public class UserGood {
@Id
@GeneratedValue()
@Column(name = "user_good_id")
private long userGoodId;
@Column(name = "date")
private Date date;
@JoinColumn(name="good_id",nullable = true)
@ManyToOne(cascade = {CascadeType.MERGE,CascadeType.REFRESH},optional = false)
private Good good;
@JoinColumn(name="user_id",nullable = true)
@ManyToOne(cascade = {CascadeType.MERGE,CascadeType.REFRESH},optional = false)
private User user;
//..setter getter省略
}