Hibernate 映射多对多关联关系

来源:互联网 发布:react和js关系 编辑:程序博客网 时间:2024/06/01 08:12

第一步首先设计数据库表, 我分别设计的是: 用户表. 角色表 . 关系表

第二步设计实体类:在用户表里面添加一个Set集合代码如下:



 User.hbm.xml

        文件中要使用<many-to-many>标签,并且在标签中添加上对应的列关系,因为你要让两个对象中都要清楚它们之间的映射是如何使用的,并且在生成的关系表中哪一列是对应的自己的外键,所以要在该标签中指明,另外在<set>标签中添加table属性会指明要生成新表,下面的示例中添加了u_r,所以会生成新的关联表。

[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>  
  6.     <class name="com.src.hibernate.User" table="t_user">  
  7.         <id name="id">  
  8.             <generator class="native"/>  
  9.         </id>  
  10.         <property name="uname"/>  
  11.         <set name="roles" table="u_r">  
  12.             <key column="uid"></key>  
  13.             <many-to-many class="com.src.hibernate.Role" column="rid"></many-to-many>  
  14.         </set>  
  15.     </class>  
  16. </hibernate-mapping>  

 在角色表里面添加一个Set集合代码如下:



Roles.hbm.xml

  因为是单向的关系,所以在该映射文件中就不需要添加多余的标签来维护关系了,它的内部代码也会很简单,对应的映射代码如下:



第三步配置Hibernade.cfg.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>  
  6.     <class name="com.src.hibernate.Role" table="t_role">  
  7.         <id name="id">  
  8.             <generator class="native"/>  
  9.         </id>  
  10.         <property name="name"/>  
  11.     </class>  
  12. </hibernate-mapping>  
第四步在创建一个page包,一个class测试类里面写测试类内容,我的测试类名是:TestManyToMany




用户表运行结果如下:



  角色表运行结果如下:

     

 关系表运行结果如下:




二、双向多对多


        双向的多对多映射可以看做是单向的一种扩展,它其实是为了设置在两端同时维护关系,从任何一端都能够加载到另一端的内容,在实现上和单向的起始端是相同的都要使用<many-to-many>标签。

        同样以上面的User和Role来做示例,上面的示例中使用了单向的多对多,不同的是这里要使用双向关系,所以要在Role的一端添加同样的映射关系,并在相应的对象中添加集合映射,其中对应的User内的代码不会发生改变。


Roles.hbm.xml

       因为是双向的多对多所以要在对象的两端同时加入双向的集合映射,也就是在配置文件中添加<set>标签,并在标签中添加<many-to-many>标签,具体的配置方法类似于上文的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>  
  6.     <class name="com.src.hibernate.Role" table="t_role">  
  7.         <id name="id">  
  8.             <generator class="native"/>  
  9.         </id>  
  10.         <property name="name"/>  
  11.           
  12.         <!-- 添加集合映射,映射的表名应该同User.hbm.xml中配置的表名相同 -->  
  13.         <set name="users" table="u_r">  
  14.             <key column="rid"/><!-- 添加映射的外键 -->  
  15.             <!-- 添加多对多的关系 -->  
  16.             <many-to-many class="com.src.hibernate.User" column="uid"></many-to-many>  
  17.         </set>  
  18.     </class>  
  19. </hibernate-mapping>  


 2.2 Roles.java

    同单向的多对多关系中的文件相同,不过需要在对象中添加集合映射Set,使用set来标明映射的集合,如下代码:

[java] view plain copy
  1. package com.src.hibernate;  
  2.   
  3. import java.util.Set;  
  4.   
  5. public class Roles {  
  6.     //id标示  
  7.     private int rid;  
  8.     public int getId() {  
  9.         return id;  
  10.     }  
  11.     public void setId(int id) {  
  12.         this.id = id;  
  13.     }  
  14.       
  15.     //名称  
  16.     private String name;  
  17.     public String getName() {  
  18.         return name;  
  19.     }  
  20.     public void setName(String name) {  
  21.         this.name = name;  
  22.     }  
  23.       
  24.     //用户集合  
  25.     private Set users;  
  26.     public Set getUsers() {  
  27.         return users;  
  28.     }  
  29.     public void setUsers(Set users) {  
  30.         this.users = users;  
  31.     }  
  32.       
  33. }  

       双向关联映射是在单向的关联映射基础上配置而来的,只需要在映射文件的两端同时配置<many-to-many>即可,也就是说Users.hbm.xml和Users.java代码和上文中的代码相同,不发生变化,所以不再重复添加了。


结语:

        完整的单向多对多讨论完整,需要注意的主要是users.hbm.xml中配置的方法,需要使用<many-to-many>标签并且需要生成关系表来维护多对多的关系,其它的内容都是很简单的。





原创粉丝点击