? ? ?今天來說說Hibernate中的多對多關聯映射,多對多關聯映射涉及到單向映射和雙向映射2種。
? ? ?首先舉個多對多關聯例子:用戶User和角色Role,一個用戶可以屬于多個角色,一個角色可以有多個用戶。這就是典型的多對多關聯的例子。而單向關聯映射則是只能由A端去操作B端,B端不能操作A端的數據。而雙向關聯映射則是A,B兩端都可以操作另一端的數據。
? ? 先說單向關聯映射,實體類如下:
~~~
/**
* 學生類
* @author Longxuan
*
*/
public class User {
private int id;
private String name;
private Set<Role> roles;
//此處省略get和set方法
}
/**
* 班級類
* @author Longxuan
*
*/
public class Role {
private int id;
private String name;
//此處省略get和set方法
}
~~~
? ? ?映射文件:
~~~
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.bjpowernode.hibernate">
<class name="User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="roles" table="t_user_role">
<key column="user_id"></key>
<many-to-many class="Role" column="roleid"></many-to-many>
</set>
</class>
<class name="Role" table="t_role">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>
~~~
? ? ?User類有Role的Set集合,而且映射文件中也設置了Set標簽和many-to-many標簽,所以可以通過User操作Role,但是卻不能從Role中操作數據。多對多的關系維護用到了第三張表t_user_role。它存放了User和Role的主鍵。
? ? ?從上面的單向多對多關聯映射來看,我可以查某個用戶屬于哪些角色,但是卻不能查某個角色中有哪下用戶。所以為了解決這個問題,我們采用雙向關聯映射。
? ? 其實說白了,雙向關聯映射就是在2端都設置一下映射關系。即在Role中同樣添加User的set集合:
~~~
/**
* 班級類
* @author Longxuan
*
*/
public class Role {
private int id;
private String name;
private Set<User> users;
//此處省略get和set方法
}
~~~
? ? 映射文件中的Role部分也要做相應的修改:
~~~
<class name="Role" table="t_role">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="users" table="t_user_role">
<key column="roleid"></key>
<many-to-many class="User" column="user_id"></many-to-many>
</set>
</class>
~~~
? ? ?值得注意的是,配置文件中的table和兩個column,都必須是一致的。否則肯定會出錯的。如果表名不一樣了,那么就會生成2張中間表,一張有User維護,一張有Role。因為它變成了2個多對多單向關聯映射。如果列名不一致了,就會出列來。還是變成了2個多對多單向關聯映射。同時數據也發生了冗余。
? ? ?所以雙向關聯映射,一定要保證2端的映射關系都設置一致了。才能稱之為“雙向關聯映射”。
- 前言
- Struts 簡單小結
- 深入淺出了解Struts的處理流程(有圖有真相)
- struts標簽+jstl標簽之國際化實例
- 一口一口吃掉Hibernate(二)——別被世俗蒙蔽了雙眼:Hibernate中Session之get和load方法的真正區別
- 一口一口吃掉Hibernate(一)——使用SchemaExport生成數據表
- 一口一口吃掉Hibernate(三)——Hibernate給表和字段設置前后綴及分隔符
- 一口一口吃掉Hibernate(四)——多對一單向關聯映射
- 一口一口吃掉Hibernate(五)——一對多單向關聯映射
- 一口一口吃掉Hibernate(六)——多對多關聯映射
- 一口一口吃掉Hibernate(七)——繼承映射
- 一口一口吃掉Hibernate(八)——Hibernate中inverse的用法
- 一覽Spring全貌
- 包辦婚姻的Spring IoC
- 3幅圖讓你了解Spring AOP
- Spring Aop實例之xml配置
- Spring Aop實例之AspectJ注解配置