【Hibernate】多对多关联映射

    xiaoxiao2021-03-25  55

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

     

    映射原理

     

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

     

    举例

     

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

     

    分类

     

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

     

    对象模型

                  

    关系模型

                

     

    实例

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

    User

    [java]  view plain  copy  print ? package com.liang.hibernate;      import java.util.Set;      public class User {       private int id;       private String name;              private Set roles;              public int getId() {           return id;       }       public void setId(int id) {           this.id = id;       }       public Set getRoles() {           return roles;       }       public void setRoles(Set roles) {           this.roles = roles;       }       public String getName() {           return name;       }       public void setName(String name) {           this.name = name;       }          }  

    Role

    [java]  view plain  copy  print ? package com.liang.hibernate;      public class Role {       private int id;       private String name;              public int getId() {           return id;       }       public void setId(int id) {           this.id = id;       }       public String getName() {           return name;       }       public void setName(String name) {           this.name = name;       }   }  

    User.hbm.xml

    [html]  view plain  copy  print ? <?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

    [html]  view plain  copy  print ? <?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

    [html]  view plain  copy  print ? package com.liang.hibernate;   import java.util.Set;      public class User {       private int id;       private String name;              private Set roles;              public int getId() {           return id;       }       public void setId(int id) {           this.id = id;       }       public Set getRoles() {           return roles;       }       public void setRoles(Set roles) {           this.roles = roles;       }       public String getName() {           return name;       }       public void setName(String name) {           this.name = name;       }          }  

    Role

    [java]  view plain  copy  print ? package com.liang.hibernate;   import java.util.Set;   public class Role {       private int id;       private String name;       private Set users;              public Set getUsers() {           return users;       }       public void setUsers(Set users) {           this.users = users;       }       public int getId() {           return id;       }       public void setId(int id) {           this.id = id;       }       public String getName() {           return name;       }       public void setName(String name) {           this.name = name;       }   }  

    User.hbm.xml

    [html]  view plain  copy  print ? <?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

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

     

    总结

     

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

    转载请注明原文地址: https://ju.6miu.com/read-36784.html

    最新回复(0)