zoukankan      html  css  js  c++  java
  • 一口一口吃掉Hibernate(六)——多对多关联映射

          今天来说说hibernate中的多对多关联映射,多对多关联映射涉及到单向映射和双向映射2种。

           首先举个多对多关联例子:用户User和角色Role,一个用户可以属于多个角色,一个角色可以有多个用户。这就是典型的多对多关联的例子。而单向关联映射则是只能由A端去操作B端,B端不能操作A端的数据。而双向关联映射则是A,B两端都可以操作另一端的数据。

          先说单向关联映射,实体类如下:

    1. <span style="font-size:18px">/** 
    2.  * 学生类 
    3.  * @author Longxuan 
    4.  * 
    5.  */  
    6. public class User {  
    7.   
    8.     private int id;  
    9.       
    10.     private String name;  
    11.       
    12.     private Set<Role> roles;  
    13.       
    14.     //此处省略get和set方法  
    15. }  
    16.   
    17. /** 
    18.  * 班级类 
    19.  * @author Longxuan 
    20.  * 
    21.  */  
    22. public class Role {  
    23.   
    24.     private int id;  
    25.       
    26.     private String name;  
    27.       
    28.     //此处省略get和set方法  
    29. }  
    30.   
    31. </span>  


           映射文件:

    1. <span style="font-size:18px"><?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.bjpowernode.hibernate">  
    6.     <class name="User" table="t_user">  
    7.         <id name="id">  
    8.             <generator class="native"/>  
    9.         </id>  
    10.         <property name="name"/>  
    11.         <set name="roles" table="t_user_role">  
    12.             <key column="user_id"></key>  
    13.             <many-to-many class="Role" column="roleid"></many-to-many>  
    14.         </set>  
    15.     </class>  
    16.       
    17.     <class name="Role" table="t_role">  
    18.         <id name="id">  
    19.             <generator class="native"/>  
    20.         </id>  
    21.         <property name="name"/>  
    22.     </class>    
    23.       
    24. </hibernate-mapping></span>  


           User类有Role的Set集合,而且映射文件中也设置了Set标签和many-to-many标签,所以可以通过User操作Role,但是却不能从Role中操作数据。多对多的关系维护用到了第三张表t_user_role。它存放了User和Role的主键。

           从上面的单向多对多关联映射来看,我可以查某个用户属于哪些角色,但是却不能查某个角色中有哪下用户。所以为了解决这个问题,我们采用双向关联映射。

          其实说白了,双向关联映射就是在2端都设置一下映射关系。即在Role中同样添加User的set集合:

    1. <span style="font-size:18px">/** 
    2.  * 班级类 
    3.  * @author Longxuan 
    4.  * 
    5.  */  
    6. public class Role {  
    7.   
    8.     private int id;  
    9.       
    10.     private String name;  
    11.       
    12.     private Set<User> users;  
    13.       
    14.     //此处省略get和set方法  
    15. }  
    16. </span>  


          映射文件中的Role部分也要做相应的修改:

    1. <span style="font-size:18px"><class name="Role" table="t_role">  
    2.     <id name="id">  
    3.         <generator class="native"/>  
    4.     </id>  
    5.     <property name="name"/>  
    6.     <set name="users" table="t_user_role">  
    7.         <key column="roleid"></key>  
    8.         <many-to-many class="User" column="user_id"></many-to-many>  
    9.     </set>  
    10. </class></span>  

           值得注意的是,配置文件中的table和两个column,都必须是一致的。否则肯定会出错的。如果表名不一样了,那么就会生成2张中间表,一张有User维护,一张有Role。因为它变成了2个多对多单向关联映射。如果列名不一致了,就会出列来。还是变成了2个多对多单向关联映射。同时数据也发生了冗余。

           所以双向关联映射,一定要保证2端的映射关系都设置一致了。才能称之为“双向关联映射”。

  • 相关阅读:
    python struct使用
    pythonunittest(1)
    python os.path模块学习(转)
    pythonunittest(2)
    主机+虚拟机Ubuntu+开发板互相ping通
    wince 外部中断调用可安装ISR错误(data abort)
    wince firstboot.nb0 的大小的问题解决
    wince 串口索引超过10个解决方法
    wince uboot 启动 wince
    zigbee 天线的设计
  • 原文地址:https://www.cnblogs.com/KingIceMou/p/7100988.html
Copyright © 2011-2022 走看看