zoukankan      html  css  js  c++  java
  • (Hibernate进阶)Hibernate映射——多对多关联映射(八)

    多对多映射是现实生活中最常见的映射,也是最容易理解的映射。废话少说,直接开始。

     

    映射原理

     

         不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联。用第三张表来解决可能会造成数据冗余的问题。

    举例

    一个用户(User)对多个角色(Role),一个角色对多个用户。

    分类

    单向的多对多关联映射(单向User--->Role)

    对象模型

                 

    关系模型

               

    实例

          下面我们看一下实体类和映射文件的代码。

    User

    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. }  

    Role

    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

    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

    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

    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

    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

    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

    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的映射文件相同,值得注意的是生成的中间表名称必须一样,生成中间表的字段必须一样。

     

    总结

     

          多对多关联映射到此就结束了,经过对一对多关联映射的学习,相对而言,多对多关联映射变得非常的简单了,非常像一对多关联映射的变体。

     

          Hibernate的总结篇马上杀到,谢谢关注。

    转:http://blog.csdn.net/jiuqiyuliang/article/details/41015645

  • 相关阅读:
    mysql报错:java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone.
    MD5登陆密码的生成
    15. 3Sum、16. 3Sum Closest和18. 4Sum
    11. Container With Most Water
    8. String to Integer (atoi)
    6. ZigZag Conversion
    5. Longest Palindromic Substring
    几种非线性激活函数介绍
    AI初探1
    AI初探
  • 原文地址:https://www.cnblogs.com/xijin-wu/p/6085784.html
Copyright © 2011-2022 走看看