Hibernate映射关系之多对多

1、用户表user和优惠券coupon存在多对多的关系,一个用户可以拥有多个优惠券,一个优惠券可以从属于多个用户。

2、user.java,创建了中间表tb_user_coupon

(1)JoinTable表示中间表的

(2)

/**
     * 一个用户可以拥有多个优惠券 但优惠券只有自己的属性,没有用户的引用 单边的一对多关系
     */
    @ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST })
    @JoinTable(name = "tb_user_coupon", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "coupon_id", referencedColumnName = "id"))
    // fetch配置加载方式(延迟或即时)
    // cascade配置级联方式,表示在增删查改user类时,会自动在数据库中保存、删除、修改、刷新属于他的Email对象
    private List<Coupon> coupons =new ArrayList<Coupon>() ;

3、coupon.java

(1)由于已经在user中配置了数据库表的映射,mappedBy指定user类里面coupon的变量名

@ManyToMany(mappedBy="coupons")
private Set<User> users=new HashSet<Post>();

4、在中间表添加字段

注意第三张表的几点配置

(1)表名要与@JoinTable一致

(2)两个@JoinTable的name分别保持一致,不然会产生其他的字段

Done

@Entity
@Table(name = "tb_user_coupon")
public class UserCoupon {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @ManyToOne
    @JoinColumn(name = "user_id",nullable=false)
    private User user;
    @ManyToOne
    @JoinColumn(name = "coupon_id",nullable=false)
    private Coupon coupon;

    @Column(updatable = false, nullable = false, columnDefinition = "timestamp default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
    @Temporal(TemporalType.TIMESTAMP)
    private Date createdDate = new Date();

}

Done

原文地址:https://www.cnblogs.com/xingyyy/p/3903519.html