Hibernate (2) --多对多 中间表设计及映射

本文探讨了Hibernate中多对多关系的映射,特别是当中间表包含额外字段时的情况。在情况一,中间表user_good仅包含good_id和user_id。而在情况二,中间表扩展了字段,导致good与user_good、user与user_good形成一对多关系,而user_good与good和user则是多对一关系。实体注解形式的映射在这种情况下的实现进行了详细说明。

数据库设计: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省略
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值