標籤:ble 映射關係 any 設定 tle art 關係 replace tag
今天來說說hibernate中的多對多關聯映射,多對多關聯映射涉及到單向映射和雙向映射2種。
首先舉個多對多關聯例子:使用者User和角色Role,一個使用者可以屬於多個角色,一個角色可以有多個使用者。這就是典型的多對多關聯的例子。而單向關聯映射則是只能由A端去操作B端,B端不能操作A端的資料。而雙向關聯映射則是A,B兩端都可以操作另一端的資料。
先說單向關聯映射,實體類如下:
- <span style="font-size:18px">/**
- * 學生類
- * @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方法
- }
-
- </span>
對應檔:
- <span style="font-size:18px"><?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></span>
User類有Role的Set集合,而且對應檔中也設定了Set標籤和many-to-many標籤,所以可以通過User操作Role,但是卻不能從Role中操作資料。多對多的關係維護用到了第三張表t_user_role。它存放了User和Role的主鍵。
從上面的單向多對多關聯映射來看,我可以查某個使用者屬於哪些角色,但是卻不能查某個角色中有哪下使用者。所以為瞭解決這個問題,我們採用雙向關聯映射。
其實說白了,雙向關聯映射就是在2端都設定一下映射關係。即在Role中同樣添加User的set集合:
- <span style="font-size:18px">/**
- * 班級類
- * @author Longxuan
- *
- */
- public class Role {
-
- private int id;
-
- private String name;
-
- private Set<User> users;
-
- //此處省略get和set方法
- }
- </span>
對應檔中的Role部分也要做相應的修改:
- <span style="font-size:18px"><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></span>
值得注意的是,設定檔中的table和兩個column,都必須是一致的。否則肯定會出錯的。如果表名不一樣了,那麼就會產生2張中間表,一張有User維護,一張有Role。因為它變成了2個多對多單向關聯映射。如果列名不一致了,就會出列來。還是變成了2個多對多單向關聯映射。同時資料也發生了冗餘。
所以雙向關聯映射,一定要保證2端的映射關係都設定一致了。才能稱之為“雙向關聯映射”。
一口一口吃掉Hibernate(六)——多對多關聯映射