Hibernate映射——多對多關聯映射(八)

映射原理

 

     不管是單向關聯仍是雙向關聯都是經過第三張表,將兩個表中的主鍵放到第三張作一個關聯。用第三張表來解決可能會形成數據冗餘的問題。html

 

舉例

 

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

 

分類

 

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

 

對象模型app

              

關係模型測試

            

 

實例this

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

User.net

[java] view plain copyhibernate

  1. package com.liang.hibernate;  
  2.   
  3. import java.util.Set;  
  4.   
  5. public class User {  
  6.     private int id;  
  7.     private String name;  
  8.       
  9.     private Set roles;  
  10.       
  11.     public int getId() {  
  12.         return id;  
  13.     }  
  14.     public void setId(int id) {  
  15.         this.id = id;  
  16.     }  
  17.     public Set getRoles() {  
  18.         return roles;  
  19.     }  
  20.     public void setRoles(Set roles) {  
  21.         this.roles = roles;  
  22.     }  
  23.     public String getName() {  
  24.         return name;  
  25.     }  
  26.     public void setName(String name) {  
  27.         this.name = name;  
  28.     }  
  29.       
  30. }  

Rolexml

[java] view plain copyhtm

  1. package com.liang.hibernate;  
  2.   
  3. public class Role {  
  4.     private int id;  
  5.     private String name;  
  6.       
  7.     public int getId() {  
  8.         return id;  
  9.     }  
  10.     public void setId(int id) {  
  11.         this.id = id;  
  12.     }  
  13.     public String getName() {  
  14.         return name;  
  15.     }  
  16.     public void setName(String name) {  
  17.         this.name = name;  
  18.     }  
  19. }  

User.hbm.xml

[html] view plain copy

  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping package="com.liang.hibernate">  
  6.     <class name="User" table="t_user">  
  7.         <id name="id">  
  8.             <generator class="native"></generator>  
  9.         </id>  
  10.         <property name="name"></property>  
  11.         <!-- roles屬性,表達的是本對象(User)與Role的多對多的關係 -->    
  12.         <set name="roles" table="t_user_role">  
  13.             <!--當前表(User)的主鍵-->  
  14.             <key column="user_id"></key>  
  15.             <many-to-many class="Role" column="role_id"></many-to-many>  
  16.         </set>  
  17.     </class>  
  18. </hibernate-mapping>  

Role.hbm.xml

[html] view plain copy

  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping package="com.liang.hibernate">  
  6.     <class name="Role" table="t_role">  
  7.         <id name="id">  
  8.             <generator class="native"></generator>  
  9.         </id>  
  10.         <property name="name"></property>  
  11.     </class>  
  12. </hibernate-mapping>  

生成的表結構和測試數據

 

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

 

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

 

 

對象模型

             

關係模型

 

       同上

 

實例

      

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

User

[html] view plain copy

  1. package com.liang.hibernate;  
  2. import java.util.Set;  
  3.   
  4. public class User {  
  5.     private int id;  
  6.     private String name;  
  7.       
  8.     private Set roles;  
  9.       
  10.     public int getId() {  
  11.         return id;  
  12.     }  
  13.     public void setId(int id) {  
  14.         this.id = id;  
  15.     }  
  16.     public Set getRoles() {  
  17.         return roles;  
  18.     }  
  19.     public void setRoles(Set roles) {  
  20.         this.roles = roles;  
  21.     }  
  22.     public String getName() {  
  23.         return name;  
  24.     }  
  25.     public void setName(String name) {  
  26.         this.name = name;  
  27.     }  
  28.       
  29. }  

Role

[java] view plain copy

  1. package com.liang.hibernate;  
  2. import java.util.Set;  
  3. public class Role {  
  4.     private int id;  
  5.     private String name;  
  6.     private Set users;  
  7.       
  8.     public Set getUsers() {  
  9.         return users;  
  10.     }  
  11.     public void setUsers(Set users) {  
  12.         this.users = users;  
  13.     }  
  14.     public int getId() {  
  15.         return id;  
  16.     }  
  17.     public void setId(int id) {  
  18.         this.id = id;  
  19.     }  
  20.     public String getName() {  
  21.         return name;  
  22.     }  
  23.     public void setName(String name) {  
  24.         this.name = name;  
  25.     }  
  26. }  

User.hbm.xml

[html] view plain copy

  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping package="com.liang.hibernate">  
  6.     <class name="User" table="t_user">  
  7.         <id name="id">  
  8.             <generator class="native"></generator>  
  9.         </id>  
  10.         <property name="name"></property>  
  11.         <!-- roles屬性,表達的是本對象(User)與Role的多對多的關係 -->    
  12.         <set name="roles" table="t_user_role">  
  13.             <!--當前表(User)的主鍵-->  
  14.             <key column="user_id"></key>  
  15.             <many-to-many class="Role" column="role_id"></many-to-many>  
  16.         </set>  
  17.     </class>  
  18. </hibernate-mapping>  

Role.hbm.xml

[html] view plain copy

  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping package="com.liang.hibernate">  
  6.     <class name="Role" table="t_role">  
  7.         <id name="id">  
  8.             <generator class="native"></generator>  
  9.         </id>  
  10.         <property name="name"></property>  
  11.         <!-- users屬性,表達的是本對象(Role)與User的多對多的關係 -->    
  12.         <set name="users" table="t_user_role">  
  13.             <!--當前表(Role)的主鍵-->                  
  14.             <key column="role_id"></key>  
  15.             <many-to-many class="User" column="user_id"></many-to-many>  
  16.         </set>  
  17.     </class>  
  18. </hibernate-mapping>  

生成的表結構和測試數據

 

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

相關文章
相關標籤/搜索