文档章节

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

architect刘源源
 architect刘源源
发布于 2018/01/11 19:20
字数 839
阅读 9
收藏 1

映射原理

 

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

 

举例

 

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

 

© 著作权归作者所有

architect刘源源

architect刘源源

粉丝 164
博文 518
码字总数 922891
作品 0
浦东
程序员
私信 提问
NHibernate从入门到精通系列(10)——多对多关联映射

内容摘要 单向多对多关联映射 双向多对多关联映射 一、单向多对多关联映射 1.1 多对多关联映射描述 众所周知,持久化类的有三种对应关系:“一对一”、“一对多(多对一)”和“多对多”。在...

长平狐
2012/06/11
398
0
hibernate七种对应关系映射

首先我们了解一个名词ORM,全称是(Object Relational Mapping),即对象关系映射。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对数据库的...

无敌小学僧
2018/05/17
0
0
【持久化框架】Mybatis与Hibernate的详细对比

前言 这篇博文我们重点分析一下Mybatis与Hibernate的区别,当然在前面的博文中我们已经深入的研究了Mybatis和Hibernate的原理。 Mybatis 【持久化框架】Mybatis简介与原理 【持久化框架】Spr...

sietai
2018/05/18
0
0
Hibernate映射——多对一单向关联映射(四)

这篇博客,我们开始介绍基于基本映射的关联关系映射。 概念 基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型中有一...

architect刘源源
2018/01/11
3
0
Hibernate映射解析——七种映射关系

首先我们了解一个名词ORM,全称是(Object Relational Mapping),即对象关系映射。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对数据库的...

universeye
2014/05/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

protoc 编译工具

在进行开发 protoc 之前,你需要首先在你的计算机中安装 protoc 编译工具。 下载编译工具 进入 Protocol Buffers 的源代码中然后选择发布的版本中,找到对应的版本。项目的链接地址为:https...

honeymoose
40分钟前
1
0
uniapp + bootstrapvue 移动/PC 一套搞定 (一)配置bootstrapvue

1.准备文件 自己到DCloud官网: http://dcloud.io/ 去下载官方的IDE Hbuilder,新建一个空的uniapp项目即可。 uniapp框架自带优化的vue,我们仅仅需要准备以下三个文件: bootstrap.min.css ...

panyunxing
今天
9
0
Android Camera原理之camera service类与接口关系

camera service主要是指 frameworks/av/services/camera/下面的代码,最近在看这一块的代码,为了更好地理清这一块的代码,也为了后续学习camera方便一些,我觉得很有必要理一下这一块的整体...

天王盖地虎626
今天
2
0
Golang学习笔记

[TOC] Golang学习笔记 这个学习笔记是最早在1.初,版本左右的时候写的,和当前最新的版本可能会有较大的差异. 因为成文比较早,文章里面又有很多自己的见解,有些东西当时理解的不太透彻可能写错...

我爱吃炒鸡
今天
14
0
科技赋能成效显著!金融壹账通两大赋能项目荣获IDC大奖

7月19日,2019IDC中国未来金融论坛曁颁奖典礼于北京举办。由金融壹账通赋能的长春农商银行多人视频面审智能风控系统、包头农商银行互联网银行SaaS服务两大项目因在项目的创新性、技术领先性、...

IFTNews
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部