Hibernate关联映射(一对多/多对多)
版权声明:翀版 https://blog.csdn.net/biggerchong/article/details/84340105
3. Hibernate关联映射
上接Hibernate持久化类:https://blog.csdn.net/biggerchong/article/details/84260707
目录
3. Hibernate关联映射
3.1 数据库表之间的关系
3.1.1 一对多关系
3.1.2 多对多关系
3.1.3 一对一关系(实际开发中使用较少)
3.2 实战Hibernate一对多关联映射
3.2.1 创建数据表(客户----联系人)
3.2.2 创建Java项目Hibernate5Study3
3.2.3 创建持久化类(Customer、LinkMan)
3.2.4 创建文件映射关系
3.2.5 Hibernate核心映射
3.2.6 测试一对多关联映射
3.2.7 一对多级联操作
3.2.8 双向级联产生多余SQL
3.3 实战多对多关联映射
3.3.1 创建表
3.3.2 创建实体
3.3.3 创建映射
3.3.4 编写测试类
3.1 数据库表之间的关系
3.1.1 一对多关系
一张表中的一条记录对应另一张表中的多条记录;反之不成立。
一对多关系建表原则:
3.1.2 多对多关系
一张表中的一条记录对应另一张表中的多条记录;反之也成立。
多对多关系建表原则:
3.1.3 一对一关系(实际开发中使用较少)
一张表中的一条记录对应另一张表中的唯一一条记录;反之也成立。(可以用一张表替代)
一对一关系建表原则:
3.2 实战Hibernate一对多关联映射
3.2.1 创建数据表(客户----联系人)
客户表:
CREATE TABLE `cst_customer` (
`cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
`cust_name` varchar(32) NOT NULL COMMENT '客户名称(公司名称)',
`cust_source` varchar(32) DEFAULT NULL COMMENT '客户信息来源',
`cust_industry` varchar(32) DEFAULT NULL COMMENT '客户所属行业',
`cust_level` varchar(32) DEFAULT NULL COMMENT '客户级别',
`cust_phone` varchar(64) DEFAULT NULL COMMENT '固定电话',
`cust_mobile` varchar(16) DEFAULT NULL COMMENT '移动电话',
PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
联系人表:
CREATE TABLE `cst_linkman` (
`lkm_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '联系人编号(主键)',
`lkm_name` varchar(16) DEFAULT NULL COMMENT '联系人姓名',
`lkm_cust_id` bigint(32) DEFAULT NULL COMMENT '客户id',
`lkm_gender` char(1) DEFAULT NULL COMMENT '联系人性别',
`lkm_phone` varchar(16) DEFAULT NULL COMMENT '联系人办公电话',
`lkm_mobile` varchar(16) DEFAULT NULL COMMENT '联系人手机',
`lkm_email` varchar(64) DEFAULT NULL COMMENT '联系人邮箱',
`lkm_qq` varchar(16) DEFAULT NULL COMMENT '联系人qq',
`lkm_position` varchar(16) DEFAULT NULL COMMENT '联系人职位',
`lkm_memo` varchar(512) DEFAULT NULL COMMENT '联系人备注',
PRIMARY KEY (`lkm_id`),
KEY `FK_cst_linkman_lkm_cust_id` (`lkm_cust_id`),
CONSTRAINT `FK_cst_linkman_lkm_cust_id` FOREIGN KEY (`lkm_cust_id`) REFERENCES `cst_customer` (`cust_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
客户-----联系人关系图(一对多关系):
3.2.2 创建Java项目Hibernate5Study3
引入相应Jar包 并build path
3.2.3 创建持久化类(Customer、LinkMan)
Customer:
LinkMan:
并加上相应得到getter/setter方法,构造函数
3.2.4 创建文件映射关系
LinkMan.hbm.xml文件:
Customer.hbm.xml文件:
3.2.5 Hibernate核心映射
红框内注意,其他与之间介绍的一样。
3.2.6 测试一对多关联映射
3.2.7 一对多级联操作
级联:操作一个对象的时候,会同时操作与其相关联的对象。
级联方向性:
从one到many的方向:操作one对象能同时操作many对象
从many到one的方向:操作many对象能同时操作one对象
级联保存或更新
从one到many的方向:改变one(Customer.hbm.xml)的映射文件
从many到one的方向:改变many(LinkMan.hbm.xml)的映射文件
注:注意级联方向,session.save(…);会产生级联关系的保存(隐式保存)
级联删除:关联起来同时删除
在没有配置的情况下,Hibernate默认先将关联外键取消置为null,然后再删除指定记录,不会进行级联删除
下面在对应的映射文件中进行配置实现级联删除(仍然具有方向性):
LinkMan.hbm.xml文件(基本不用)
Customer.hbm.xml文件
3.2.8 双向级联产生多余SQL
解决多余的SQL语句:
单向维护
使一方放弃外键维护权:one的一方放弃。在set上配置inverse=”true”
说明:cascade控制级联关系,inverse控制外键关联关系(inverse=”true”取消外键关联关系)
3.3 实战多对多关联映射
3.3.1 创建表
用户表
CREATE TABLE `sys_user` (
`user_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '用户id',
`user_code` varchar(32) NOT NULL COMMENT '用户账号',
`user_name` varchar(64) NOT NULL COMMENT '用户名称',
`user_password` varchar(32) NOT NULL COMMENT '用户密码',
`user_state` char(1) NOT NULL COMMENT '1:正常,0:暂停',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
角色表
CREATE TABLE `sys_role` (
`role_id` bigint(32) NOT NULL AUTO_INCREMENT,
`role_name` varchar(32) NOT NULL COMMENT '角色名称',
`role_memo` varchar(128) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`role_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
中间表
CREATE TABLE `sys_user_role` (
`role_id` bigint(32) NOT NULL COMMENT '角色id',
`user_id` bigint(32) NOT NULL COMMENT '用户id',
PRIMARY KEY (`role_id`,`user_id`),
KEY `FK_user_role_user_id` (`user_id`),
CONSTRAINT `FK_user_role_role_id` FOREIGN KEY (`role_id`) REFERENCES `sys_role` (`role_id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `FK_user_role_user_id` FOREIGN KEY (`user_id`) REFERENCES `sys_user` (`user_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
3.3.2 创建实体
用户的实体
角色的实体
3.3.3 创建映射
用户的映射
角色的映射
3.3.4 编写测试类
说明:多对多关联映射中也存在级联更新保存与删除,与前面介绍的一对多级联更新保存与删除是一样的配置映射文件,如下图:
User.hbm.xml文件
Role.hbm.xml文件
注:一般将被动关联方(Role被User来选)的inverse设为“ture”
多对多关系中级联删除是不合理的,常规情况下不会使用;最常使用的是改选关联关系、删除关联关系、添加关联关系,这三种在实际应用中最为常见,都是遵循先get/load查询在操作关联关系(remove/add),然后session.save()、session.delete()、session.update()即可。
下接Hibernate查询与抓取策略(优化):https://blog.csdn.net/biggerchong/article/details/84402907
-----谢谢阅读! ------知飞翀
---------------------
作者:知飞翀
来源:CSDN
原文:https://blog.csdn.net/biggerchong/article/details/84340105
版权声明:本文为博主原创文章,转载请附上博文链接!
Hibernate关联映射(一对多/多对多)的更多相关文章
- (转)Hibernate关联映射——一对多(多对一)
http://blog.csdn.net/yerenyuan_pku/article/details/70152173 Hibernate关联映射——一对多(多对一) 我们以客户(Customer)与 ...
- Hibernate关联映射(单项多对一和一对多、双向一对多)
最近总是接触着新的知识点来扩展自己的知识面:不停的让自己在原地接触天空的感觉真的很美好!!!革命没有成功,程序员的我们怎么能不努力呢...... 一.用员工和部门来剖析关联映射的原理. 1)从这张截图 ...
- Hibernate 集合映射 一对多多对一 inverse属性 + cascade级联属性 多对多 一对一 关系映射
1 . 集合映射 需求:购物商城,用户有多个地址. // javabean设计 // javabean设计 public class User { private int userId; privat ...
- Hibernate关联映射之_多对一
多对一 Employee-Department 对于 员工 和 部门 两个对象,从员工的角度来看,就是多对一的一个关系--->多个员工对应一个部门 表设计: 部门表:department,id主 ...
- Java三大框架之——Hibernate关联映射与级联操作
什么是Hibernate中的关联映射? 简单来说Hibernate是ORM映射的持久层框架,全称是(Object Relational Mapping),即对象关系映射. 它将数据库中的表映射成对应的 ...
- Hibernate关联映射关系
Hibernate关联映射关系 一.双向一对多关联映射关系:当类与类之间建立了关联,就可以方便的从一个对象导航到另一个或另一组与它关联的对象(一对多双向关联和多对一双向关联是完全一样的) 1.1创建实 ...
- 第六章 Hibernate关联映射
第六章 hibernate关联映射一.本章知识点分为2部分:1.关联关系:单向多对一关联关系,双向一对多关联关系(含一对多关联关系),多对多关联关系2.延迟加载:类级别加载策略,一对多加载策略,多对一 ...
- 【学习笔记】Hibernate关联映射(Y2-1-6)
Hibernate关联映射 关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用. 1.单向多对一关联 准备数据库 部门表和员工表 其中部门表有两列 部门编号和名称 员工表有三列 员工 ...
- 第三章Hibernate关联映射
第三章Hibernate关联映射 一.关联关系 类与类之间最普通的关系就是关联关系,而且关联是有方向的. 以部门和员工为列,一个部门下有多个员工,而一个员工只能属于一个部门,从员工到部门就是多对一关联 ...
随机推荐
- sklearn中模型评估和预测
一.模型验证方法如下: 通过交叉验证得分:model_sleection.cross_val_score(estimator,X) 对每个输入数据点产生交叉验证估计:model_selection.c ...
- 通过快递100获取快递单号,结合c-lodop热敏纸打印 – 通过菜鸟ISV/自研ERP使用菜鸟电子面单
https://www.1024cc.cn/index.php/2019/04/29/%E6%89%93%E5%8D%B0%E7%94%B5%E5%AD%90%E9%9D%A2%E5%8D%95/ 打 ...
- IRP FLAGS
IRP所有标识位的含义,是 _IRP . flags 这个成员 IRP_NOCACHE 0x00000001 //表示I/O请求从存储的媒介而不是高速缓存中读取数据 IRP_PAGING_IO 0x0 ...
- dl,dt,dd标签 VS 传统table实现数据列表
过去有很多网页设计师喜欢将他们的网页效果图用table布局实现成网页,但是这样做会遇到一个比较麻烦的问题就是,后期调试和维护会相当的困难.现在,越来越多的前端开发er们开始使用xHTML+CSS替代最 ...
- 随笔记录 MBR扇区故障系统备份与还原 2019.8.7
系统备份: [root@localhost ~]# mkdir /abc [root@localhost ~]# mount /dev/sdb1 /abc [root@localhost ~]# dd ...
- matlab 求已知概率密度函数的随机数生成
N=10000; %需要随机数的个数 a=zeros(N,1); %存放随机数的数列 n=0; f1=@(t) 1./(1.2*pi*(1+5*(t-7.3).^2)); f2=@(t) 1./(1. ...
- 【学术篇】SDOI2008 山贼集团
今天一月一号.. 突然想安利一波我的中二的2017总结... 传送门1:codevs 传送门2:luogu 时限5s和1s的区别(你没看我传送门都给的大牛分站了) 现在不仅线筛.. 有负数的快读都打不 ...
- Java Collection - ArrayList & LinkedList
总结 ref: https://blog.csdn.net/qq_32679815/article/details/78907437 1-ArrayList是实现了基于动态数组的数据结构,Linked ...
- C++——虚继承(不要使用,会导致二义性)
如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的名字进行访问时,可能产生二义性 总结: 如果一个派生类从多个基类派生,而这些基类又有一个共同 的基类,则在对该基类中声明 ...
- win 安装composer (详细教程)
Composer是PHP的一个依赖管理工具,申明项目所依赖的代码库,它会在项目中为你安装,所以在实际项目开发中很方便,那么如何安装呢?今天就与大家分享下. 1首先下载好Composer,文件为exe类 ...