• (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

  • 相关阅读:
    [Swift]iOS开发之CATransform3D
    [Swift]iOS开发之锚点anchorPoint
    [Swift]iOS开发之ScrollView
    [Swift]iOS开发之不同界面传值
    [Swift]Xcode7设置网络请求权限
    tomcat非安裝方式,添加windows服務啟動方式
    tomcat配置环境变量
    .eslintrc.js
    vscode中eslint配置文件setting.json
    解决vue项目路由出现message: "Navigating to current location (XXX) is not allowed"的问题
  • 原文地址:https://www.cnblogs.com/xijin-wu/p/6085784.html
Copyright © 2020-2023  润新知