当前位置: 首页 > news >正文

Hibernate映射——多对多关联映射(八)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

映射原理

 

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

 

举例

 

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

 

分类

 

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

 

对象模型

              

关系模型

            

 

实例

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

User

[java] view plain copy

  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] view plain copy

  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] 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 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] 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 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] view plain copy

  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] view plain copy

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

 

转载于:https://my.oschina.net/architectliuyuanyuan/blog/1605796

相关文章:

  • kafka官方文档学习笔记1--基本概念了解
  • [TLSR8266] 1、搭建tlsr8266编译框架在win服务器中
  • net 自定义泛型那点事
  • Android Studio 解决 Error: /data/local/tmp/com.mazaiting.imgtomp4test安装失败问题
  • CSS选择器:伪类(图文详解)
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • 我的Java设计模式-中介者模式
  • debian配置node和nodejs环境
  • iOS开发CoreData的多表关联
  • [xsy2369]取名字
  • c3p0和druid性能测试过程中sybase卡死的问题解决过程记录
  • Alamofire上传文件
  • django第一个app,3
  • 坦克大战1.0版
  • 【Html5】-- 塔台管制
  • [译] 怎样写一个基础的编译器
  • 【5+】跨webview多页面 触发事件(二)
  • Android Volley源码解析
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • gulp 教程
  • Java方法详解
  • Mysql优化
  • opencv python Meanshift 和 Camshift
  • PHP 的 SAPI 是个什么东西
  • python学习笔记 - ThreadLocal
  • spring cloud gateway 源码解析(4)跨域问题处理
  • vue数据传递--我有特殊的实现技巧
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 闭包--闭包作用之保存(一)
  • 程序员最讨厌的9句话,你可有补充?
  • 当SetTimeout遇到了字符串
  • 高性能JavaScript阅读简记(三)
  • 聊聊redis的数据结构的应用
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 最近的计划
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​flutter 代码混淆
  • #在 README.md 中生成项目目录结构
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (十)T检验-第一部分
  • (原創) 未来三学期想要修的课 (日記)
  • (转)Sql Server 保留几位小数的两种做法
  • .gitattributes 文件
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .net wcf memory gates checking failed
  • .NET中统一的存储过程调用方法(收藏)
  • .Net转前端开发-启航篇,如何定制博客园主题
  • [2016.7 test.5] T1
  • [20160902]rm -rf的惨案.txt
  • [AutoSar]BSW_Memory_Stack_003 NVM与APP的显式和隐式同步