1. 程式人生 > >hibernate多對多關聯映射

hibernate多對多關聯映射

article 文件 映射 sof col ble AR .so pri

映射原理:

  不論是單項關聯還是雙向關聯都是通過第三張表,將兩個表中的主鍵放到第三個表中做一個關聯。用第三張表來解決可能會造成數據冗余的問題。

舉例:

  一個用戶(User)對多個角色(Role),一個角色對多個用戶。

分類:

一、單項的多對多關聯映射(單向User--->Role)

對象模型

技術分享圖片

關系模型

技術分享圖片

實例

  下面我們看一下實體類和映射文件的代碼。

User

public class User {  
    private int id;  
    private String name;  
      
    private Set roles;  
    ....
}

Role

public class Role {  
    private int id;  
    private String name;  
...
}

User.hbm.xml

<?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.liang.hibernate"> <class name="User" table="t_user"> <id name="id"> <generator class="native"></generator> </id> <property name="name"></property> <!-- roles屬性,表達的是本對象(User)與Role的多對多的關系
--> <set name="roles" table="t_user_role"> <!--當前表(User)的主鍵--> <key column="user_id"></key> <many-to-many class="Role" column="role_id"></many-to-many> </set> </class> </hibernate-mapping>

Role.hbm.xml

<?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.liang.hibernate">  
    <class name="Role" table="t_role">  
        <id name="id">  
            <generator class="native"></generator>  
        </id>  
        <property name="name"></property>  
    </class>  
</hibernate-mapping>  

多對多關聯映射,在實體類中,跟一對多關聯映射一樣,也是用集合來表示的。<set>標簽中用table屬性重命名中間表名稱,<key>標簽定義當前表的主鍵,用<many-to-many>標簽來關聯另一張表。

二、雙向的多對多關聯映射(雙向User<--->Role)

下面我們看一下實體類和映射文件的代碼。

User同上

Role

public class Role {  
    private int id;  
    private String name;  
    private Set users;  
...
}

User.hbm.xml

<?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.liang.hibernate">  
    <class name="User" table="t_user">  
        <id name="id">  
            <generator class="native"></generator>  
        </id>  
        <property name="name"></property>  
        <!-- roles屬性,表達的是本對象(User)與Role的多對多的關系 -->    
        <set name="roles" table="t_user_role">  
            <!--當前表(User)的主鍵-->  
            <key column="user_id"></key>  
            <many-to-many class="Role" column="role_id"></many-to-many>  
        </set>  
    </class>  
</hibernate-mapping>

Role.hbm.xml

<?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.liang.hibernate">  
    <class name="Role" table="t_role">  
        <id name="id">  
            <generator class="native"></generator>  
        </id>  
        <property name="name"></property>  
        <!-- users屬性,表達的是本對象(Role)與User的多對多的關系 -->    
        <set name="users" table="t_user_role">  
            <!--當前表(Role)的主鍵-->                  
            <key column="role_id"></key>  
            <many-to-many class="User" column="user_id"></many-to-many>  
        </set>  
    </class>  
</hibernate-mapping>  

多對多雙向關系中,User和Role的映射文件相同,值得註意的是生成的中間表名稱必須一樣,生成中間表的字段必須一樣。

hibernate多對多關聯映射