一口一口吃掉Hibernate(六)——多對多關聯映射

       今天來講說Hibernate中的多對多關聯映射,多對多關聯映射涉及到單向映射和雙向映射2種。html


       首先舉個多對多關聯例子:用戶User和角色Role,一個用戶能夠屬於多個角色,一個角色能夠有多個用戶。這就是典型的多對多關聯的例子。而單向關聯映射則是隻能由A端去操做B端,B端不能操做A端的數據。而雙向關聯映射則是A,B兩端均可以操做另外一端的數據。java


      先說單向關聯映射,實體類以下:node

/** * 學生類 * @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的主鍵。


       從上面的單向多對多關聯映射來看,我能夠查某個用戶屬於哪些角色,可是卻不能查某個角色中有哪下用戶。因此爲了解決這個問題,咱們採用雙向關聯映射。app


      其實說白了,雙向關聯映射就是在2端都設置一下映射關係。即在Role中一樣添加User的set集合:spa

/** * 班級類 * @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端的映射關係都設置一致了。才能稱之爲「雙向關聯映射」。.net



版權聲明:本文爲博主原創文章,未經博主容許不得轉載。hibernate

相關文章
相關標籤/搜索