单向N-N关联必须使用连接表。
Company实体:
package com.ydoing.hibernate5;import java.util.HashSet;import java.util.Set;import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.JoinTable;import javax.persistence.ManyToMany;import javax.persistence.Table;@Entity@Table(name = "company_inf")public class Company { @Id @Column(name = "company_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String name; @ManyToMany(targetEntity = Product.class, cascade = CascadeType.ALL) @JoinTable(name = "company_product", joinColumns = @JoinColumn(name = "company_id", referencedColumnName = "company_id"), inverseJoinColumns = @JoinColumn(name = "product_id", referencedColumnName = "product_id")) private Setproducts = new HashSet<>(); public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set getProducts() { return products; } public void setProducts(Set products) { this.products = products; }}
Product实体:
package com.ydoing.hibernate5;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Table;@Entity@Table(name = "product_inf")public class Product { @Id @Column(name = "product_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; }}
Console输出:
Hibernate: insert into company_inf (name) values (?)Hibernate: select last_insert_id()Hibernate: insert into product_inf (name) values (?)Hibernate: select last_insert_id()Hibernate: insert into product_inf (name) values (?)Hibernate: select last_insert_id()Hibernate: insert into company_product (company_id, product_id) values (?
, ?
) Hibernate: insert into company_product (company_id, product_id) values (?
, ?
)
从输出不难看出。Hibernate创建了连接表company_product。
数据库表: