一口一口吃掉Hibernate(六)——多对多关联映射
今天来说说hibernate中的多对多关联映射,多对多关联映射涉及到单向映射和双向映射2种。
首先举个多对多关联例子:用户User和角色Role,一个用户可以属于多个角色,一个角色可以有多个用户。这就是典型的多对多关联的例子。而单向关联映射则是只能由A端去操作B端,B端不能操作A端的数据。而双向关联映射则是A,B两端都可以操作另一端的数据。
先说单向关联映射,实体类如下:
- <span style="font-size:18px">/**
- * 学生类
- * @author Longxuan
- *
- */
- public class User {
- private int id;
- private String name;
- private Set<Role> roles;
- //此处省略get和set方法
- }
- /**
- * 班级类
- * @author Longxuan
- *
- */
- public class Role {
- private int id;
- private String name;
- //此处省略get和set方法
- }
- </span>
映射文件:
- <span style="font-size:18px"><?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.bjpowernode.hibernate">
- <class name="User" table="t_user">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
- <set name="roles" table="t_user_role">
- <key column="user_id"></key>
- <many-to-many class="Role" column="roleid"></many-to-many>
- </set>
- </class>
- <class name="Role" table="t_role">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
- </class>
- </hibernate-mapping></span>
User类有Role的Set集合,而且映射文件中也设置了Set标签和many-to-many标签,所以可以通过User操作Role,但是却不能从Role中操作数据。多对多的关系维护用到了第三张表t_user_role。它存放了User和Role的主键。
从上面的单向多对多关联映射来看,我可以查某个用户属于哪些角色,但是却不能查某个角色中有哪下用户。所以为了解决这个问题,我们采用双向关联映射。
其实说白了,双向关联映射就是在2端都设置一下映射关系。即在Role中同样添加User的set集合:
- <span style="font-size:18px">/**
- * 班级类
- * @author Longxuan
- *
- */
- public class Role {
- private int id;
- private String name;
- private Set<User> users;
- //此处省略get和set方法
- }
- </span>
映射文件中的Role部分也要做相应的修改:
- <span style="font-size:18px"><class name="Role" table="t_role">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
- <set name="users" table="t_user_role">
- <key column="roleid"></key>
- <many-to-many class="User" column="user_id"></many-to-many>
- </set>
- </class></span>
值得注意的是,配置文件中的table和两个column,都必须是一致的。否则肯定会出错的。如果表名不一样了,那么就会生成2张中间表,一张有User维护,一张有Role。因为它变成了2个多对多单向关联映射。如果列名不一致了,就会出列来。还是变成了2个多对多单向关联映射。同时数据也发生了冗余。
所以双向关联映射,一定要保证2端的映射关系都设置一致了。才能称之为“双向关联映射”。
一口一口吃掉Hibernate(六)——多对多关联映射的更多相关文章
- hibernate的多对多关联映射
在我们实际项目中,多对多的情况也时长存在,比如最常见的就是系统管理的五张表,如下面的一个结构: 在本文学习hibernate多对多关联映射的实验中我简单的写几个字段,达到学习目的即可. 1.多对多的关 ...
- 8.Hibernate的多对多关联映射
1.创建如下数据库脚本 --1.1 项目表 create table PROJECT ( proid ) not null, proname ) ) ; --1.2 项目表主键 alter table ...
- 【SSH系列】Hibernate映射 -- 多对多关联映射
映射原理 在数据库学习阶段,我们知道,如果实体和实体之间的关系是多对多,那么我们就抽出来第三张表,第一张表和第二张表的主键作为第三表的联合主键,结合我们的hibernate,多对多关联,无论 ...
- Hibernate(六)——多对多关联映射
前面几篇文章已经较讲解了三大种关联映射,多对多映射就非常简单了,不过出于对关联映射完整性的考虑,本文还是会简要介绍下多对多关联映射. 1.单向多对多关联映射 情景:一个用户可以有多个角色,比如数据录入 ...
- (Hibernate进阶)Hibernate映射——多对多关联映射(八)
多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接开始. 映射原理 不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联.用第三张表来解决可能会造成数 ...
- hibernate中多对多关联
hibernate中多对多关联 “计应134(实验班) 凌豪” 在关系数据库中有一种常见的关系即多对多关系,例如课程和学生的关系,一个学生可以选择多门课程,同时一门课程也可以被多个学生选择, 因此课程 ...
- hibernate之关于使用连接表实现多对一关联映射
[Hibernate]之关于使用连接表实现多对一关联映射 在我们项目使用中採用中间表最多的一般就是多对一,或者是多对多,当然一对一使用中间表也是能够的,可是这样的几率通常少之又少!所以这里重点介绍多对 ...
- Hibernate ManyToOne Mappings 多对一关联映射
Hibernate ManyToOne Mappings 多对一关联映射 Hibernate框架的使用步骤: 1.创建Hibernate的配置文件(hibernate.cfg.xml)2.创建持久化类 ...
- 【SSH进阶之路】Hibernate映射——多对多关联映射(八)
上篇博文[SSH进阶之路]Hibernate映射——一对多关联映射(七),我们介绍了一对多关联映射,它是多对多关联映射的基础. 多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接 ...
随机推荐
- spring MVC框架入门(外加SSM整合)
spring MVC框架 一.什么是sping MVC Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 W ...
- EasyUI 数据网格行过滤
前段时间发现一个GridView很有用的功能,可以筛选数据,实现起来很简单 一.添加一个引用,这个可以自己去网上下载 <script type="text/javascript&quo ...
- Spring Cloud学习笔记-003
服务提供者:向注册中心注册服务 1. 新建maven工程,骨架选择quickstart,工程名称:demo-member 2. 加入相关依赖: 3. 编写服务接口: 4. 在src\main\reso ...
- 使用开源数据库客户端DBeaver连接DB2数据库
下载安装 首先进入 官网 选择对应的版本进行安装. 下载下来后,一直惦记next即可完成安装(期间包括选择文件安装路径等操作,可按需修改). 连接db2 打开DBeaver,新建连接-->DBe ...
- [LeetCode] Subarray Product Less Than K 子数组乘积小于K
Your are given an array of positive integers nums. Count and print the number of (contiguous) subarr ...
- [LeetCode] Increasing Subsequences 递增子序列
Given an integer array, your task is to find all the different possible increasing subsequences of t ...
- Leetcode-颠倒整数
给定一个范围为 32 位 int 的整数,将其颠倒. 例 1: 输入: 123 输出: 321 例 2: 输入: -123 输出: -321 例 3: 输入: 120 输出: 21 注意: 假设我们的 ...
- orabbix插件监控oracle表空间问题
我们安装好orabbix插件后,查看Tablespaces监控项是发项值为none,第一反应是没监控成功,其实不然. 1.我们打开orabbix监控项参数的路径,下面为Tablespaces的sql代 ...
- enumerate给列表加序号
#coding=utf-8#给列表加上序号,enumerate(l1),默认从0开始l1=['money','house','joo']for item in enumerate(l1,1): #pr ...
- codevs 1069 关押罪犯
提交地址:http://codevs.cn/problem/1069/ 1069 关押罪犯 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻 ...