Hibernate 關系映射之多對多關聯
現實中的對象之前的關系大多是多對多的關系,因為一對一,多對一,一對多的關系都可以歸結到多對多關系的一種特殊情況。
多對多關系實作的方式:
建立一張中間表,2個字段外鍵關聯對應2張表的id,用2個多對一的關系實作多對多關聯。
一、多對多單向關聯
場景:以使用者(User)和角色(Role)關系為例 。
一個使用者對應多種角色,一種角色對應多個使用者。
- 對象關聯

實體類User
public class User {
private int id;
private String name;
private Set<Role> roles;
public int getId() {return id;}
public void setId(int id) {this.id = id;}
public String getName() {return name;}
public void setName(Stringname) {this.name = name;}
public Set<Role> getRoles() {return roles;}
public void setRoles(Set<Role> roles) {this.roles = roles;}
}
實體類Role
public class Role {
private int id;
private String name;
public int getId() return id;}
public void setId(int id) {this.id = id;}
public String getName() {return name;}
public void setName(Stringname) { this.name = name;}
}
- 關系模型
- 關聯映射
1.xml方式
在 一方添加<set>标簽 映射多對多(映射set集合),name=集合對象,然後在用<key>标簽定義外鍵。<many-to-many>标簽設定映射的類實體
<!--Role.hbm.xml-->
<class name="com.yk.hibernate.Role" table="role">
<id name="id">
<generator class="native"/>
</id>
<property name="name" column="name"/>
</class>
<!--User.hbm.xml-->
</span><class name="com.yk.hibernate.User" table="user">
<id name="id">
<generator class="native"/>
</id>
<property name="name" column="name"/>
<set name="users" table="user_role"order-by="userId"></span>
<key column="role_id"/>
<many-to-many class="com.yk.hibernate.User" column="user_id"/>
</set>
</class>
2.annotation方式
在一方類 的“多(set<E>)”對象getter方法上添加注解@ManyToMany 注解,并使用@JoinTabel來注解第三方表的名稱,再使用joinColumns屬性來指定目前對象User在中間表中的字段名, 再用inverseJoinColumns來指定目前類持有引用的實體對象Role在中間表的字段名,并且指向被引用對象相對應的表,如下:
@ManyToMany
@JoinTable(name="user_role",
joinColumns={@JoinColumn(name="user_id")},
inverseJoinColumns={@JoinColumn(name="role_id")}
)
public Set<User> getRoles() {return roles;}
二、多對多雙向關聯
場景:以上述場景為例
- 對象模型:同上
- 關系模型:同上
- 關聯映射
1.xml方式:
在單向關聯的基礎上,在另一個映射檔案建立同樣的many-to-many标簽
<!--User.hbm.xml-->
<class name="com.yk.hibernate.User" table="user">
<id name="id">
<generator class="native"/>
</id>
<property name="name" column="name"/>
<set name="users" table="user_role"order-by="userId">
<key column="role_id"/>
<many-to-many class="com.yk.hibernate.User" column="user_id"/>
</set>
</class>
2.annotation方式
多對多關聯映射 雙向 兩方都持有對象引用,修改對象模型,但資料的存儲沒有變化
隻需要修改注解映射就可以了。
在單向關聯的基礎上,另一個類的Set<E>對象上加上注釋mappedBy
User.java
@ManyToMany
@JoinTable(name="user_role",
joinColumns={@JoinColumn(name="user_id")},
inverseJoinColumns={@JoinColumn(name="role_id")}
)
public Set<User> getRoles() {return roles;}
Role.java
@ManyToMany(mappedBy="roles")
public Set<User>getUsers() {return users;}