• 【SSH进阶之路】Hibernate映射——多对多关联映射(八)


    上篇博文【SSH进阶之路】Hibernate映射——一对多关联映射(七),我们介绍了一对多关联映射,它是多对多关联映射的基础。

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

    映射原理

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

    举例

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

    分类

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

    对象模型

    关系模型

    实例

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

    User

    Java代码  收藏代码
    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

    Java代码  收藏代码
    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代码  收藏代码
    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代码  收藏代码
    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代码  收藏代码
    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代码  收藏代码
    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代码  收藏代码
    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代码  收藏代码
    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的总结篇马上杀到,谢谢关注。

  • 相关阅读:
    mac iterm2 安装 lrzsz rz sz命令
    bash rz 上传文件失败问题
    vue-router scrollBehavior无效的问题及解决方案
    dependencies devDependencies peerDependencies optionalDependencies区别
    Nuxt / Vue.js in TypeScript: Object literal may only specify known properties, but 'components' does not exist in type 'VueClass'
    NodeJS中的require和import
    Git fetch和git pull的区别, 解决Git报错:error: You have not concluded your merge (MERGE_HEAD exists).
    webstorm打开带有node_modules文件夹的工程时很卡
    CSS3自定义滚动条样式 -webkit-scrollbar
    nginx 中location和root、alias
  • 原文地址:https://www.cnblogs.com/Jeely/p/11957447.html
Copyright © 2020-2023  润新知