六 Hibernate多表操作&级联&外键维护
Hibernate的一对多关联映射
Hibernate的多对多关联映射
数据库表与表之间的关系:一对多,多对多,一对一
一对多:一个部门对应多个员工,一个员工只能属于一个部门。一个客户对应多个联系人,一个联系人只能属于一个客户
一对多建表:在多的一方创建外键。
多对多:一个学生可以选择多门课程,一门课程可以被多个学生选择。一个用户可以选择多个角色,一个角色可以被多个用户选择。
多对多建表:创建中间表。中间表至少有两个字段分别作为外键指向多对多双方的主键。
一对一(了解):
一般可以建成一张表。
一个公司只能有一个注册地址,一个注册地址只能被一个公司注册。
建表原则:
唯一外键对应,外键加约束unique来保证一对一
主键对应
表关系配置:
一对多关系的配置:多的一方放一的一方的对象,一的一方放多的一方的集合,双向配置,可以双向查询。
表架构:
实体类配置:
映射文件配置:
多的一方:
一的一方:
测试:
Hibernate一对多相关操作:
一对多的级联操作:
级联:是否会同时操作其关联的对象。级联室友方向性的,操作一的一方的时候是否会操作多的一方;操作多的一方是否会操作一的一方
级联保存更新:
保存客户级联联系人,操作的主体是客户,需要在Customer.hbm.xml中进行配置
保存联系人级联客户
级联保存或更新:保存联系人级联客户,操作的主体是联系人,需要在LinkMan.hbm.xml中进行配置
测试对象导航:
级联删除:
删除一方,将另一方的数据也一并删除
删除客户级联删除联系人:没有设置级联删除,默认情况:Hibernate修改了联系人的外键,使其为null,然后删除客户
修改设置,删除客户就删除联系人:
删除联系人级联删除客户(基本不用)
将2号联系人原来是1号客户,现在划给2号客户:
双向关联产生多余的SQL语句(客户和联系人的配置里都设置了外键(coloum="lkm_cust_id")),都能维护外键。
解决办法:一的一方放弃外键维护权。关系维护方由多的一方管理。
区分Inverse和Cascade
Hibernate多对多关系配置:
其实可以使用两个一对多,利用中间表模拟多对多的关系
多对多建立双向关系时,因为两个字段都能插入中间表,造成重复,让被动方放弃外键维护权。
建表:用户角色和中间表
配置:
domain:
hbm:
基本操作测试:
多对多级联操作:
级联保存:先让被级联的一方放弃维护权
@Test
/**
* 多对多级联保存,保存用户级联保存角色
*/
public void demo2(){ //创建2用户3角色
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction(); User user1 = new User();
user1.setUser_name("脑袋1");
Role role1 = new Role();
role1.setRole_name("研发部"); //设置双向关联关系
user1.getRoles().add(role1); //保存操作:多对多建立双向关系,一方放弃关系。因为两个字段都能插入中间表造成重复,被动方放弃外键维护权
session.save(user1);
transaction.commit();
}
@Test
/**
* 多对多级联保存,保存角色级联用户
*/
public void demo3(){ //创建2用户3角色
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction(); User user1 = new User();
user1.setUser_name("脑袋3");
Role role1 = new Role();
role1.setRole_name("研发部"); //设置双向关联关系
user1.getRoles().add(role1);
role1.getUsers().add(user1); //保存操作:多对多建立双向关系,一方放弃关系。因为两个字段都能插入中间表造成重复,被动方放弃外键维护权
session.save(role1);
transaction.commit();
}
级联删除(基本不用):
删除用户级联删除角色,配置用户cascade:delete
多对多其他操作:
- 给用户选择角色
- 给用户改选角色
- 给用户删除角色
六 Hibernate多表操作&级联&外键维护的更多相关文章
- mysql之字段的修改,添加、删除,多表关系(外键),单表详细操作(增删改)
字段的修改.添加和删除 create table tf1( id int primary key auto_increment, x int, y int ); #修改 alter table tf1 ...
- Django学习——Django测试环境搭建、单表查询关键字、神奇的双下划线查询(范围查询)、图书管理系统表设计、外键字段操作、跨表查询理论、基于对象的跨表查询、基于双下划线的跨表查询
Django测试环境搭建 ps: 1.pycharm连接数据库都需要提前下载对应的驱动 2.自带的sqlite3对日期格式数据不敏感 如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3 ...
- hibernate多表操作
一.表之间的关系 1.一对一 2.一对多 3.多对多 二.表之间关系建表原则 1.一对多:在多的一方创建一个外键,指向一的一方的主键 2.多对多:创建一个中间表,中间表至少有两个字段,分别作为外键指向 ...
- Oracle表中添加外键约束
添加主键约束: ALTER TABLE GA_AIRLINE ADD CONSTRAINT PK_AIRLINE_ID PRIMARY KEY(AIRLINE_ID); 有三种形式的外键约束: 1.普 ...
- 在PowerDesigner中设计物理模型1——表和主外键
原文:在PowerDesigner中设计物理模型1--表和主外键 在PD中建立物理模型由以下几种办法: 直接新建物理模型. 设计好概念模型,然后由概念模型生成物理模型. 设计好逻辑模型,然后由逻辑模型 ...
- SQL-46 在audit表上创建外键约束,其emp_no对应employees_test表的主键id。
题目描述 在audit表上创建外键约束,其emp_no对应employees_test表的主键id.CREATE TABLE employees_test(ID INT PRIMARY KEY NOT ...
- SQL SERVER中获取表间主外键关系
sql server 2008中的主外键关系获取方式: 转自:http://www.cnblogs.com/ke10/archive/2012/06/11/2544655.html SELECT OB ...
- 在PowerDesigner中设计物理模型1——表和主外键(转)
出处:http://www.cnblogs.com/studyzy/archive/2009/12/15/1624899.html 在PD中建立物理模型由以下几种办法: 直接新建物理模型. 设计好概念 ...
- Python3-sqlalchemy-orm 联表查询-无外键关系
#-*-coding:utf-8-*- #__author__ = "logan.xu" import sqlalchemy from sqlalchemy import crea ...
随机推荐
- svn检出两种方式的区别
第一种是“做为新项目检出,并使用新建项目向导进行配置(仅当资源库中不存在.project工程文件时才可用,意思是如果代码库中有了这个工程文件,那么它就认为这是一个信息完整的工程,在导入的过程中就不需要 ...
- Redis 简易消息队列
为了保持程序的高效,建议使用ProtoBuf. Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48, ...
- MySQL - 设置UTF-8编码
1. 在Windows上,安装时请选择UTF-8编码,以便正确地处理中文. 在Mac或Linux上,需要编辑MySQL的配置文件,把数据库默认的编码全部改为UTF-8.MySQL的配置文件默认存放在/ ...
- Oracle Parallel使用方法
一. 并行查询 并行查询允许将一个sql select语句划分为多个较小的查询,每个部分的查询并发地运行,然后将各个部分的结果组合起来,提供最终的结果,多用于全表扫描,索引全扫描等,大表的扫描和连接. ...
- 含有namespace的类型如何访问
下图中包含的String类型,如果想要在别的文件中去访问的话: 1)需要include"ApiClient.hpp" 2)需要使用oatpp::web::client::ApiCl ...
- 数据库转换Mysql-Oracle之建表语句
Mysql建库语句(导出的): DROP TABLE IF EXISTS `tablename`; CREATE TABLE `tablename` ( `C_DI_CDE` varchar(40) ...
- SwiftStack 因战略转变而裁员
导读 销售团队在前段圣诞节来临前面临裁减的糟糕处境.企业云存储公司SwiftStack进行了裁员,人数不详,公司规模因此缩小. IT外媒The Register获悉,这家公司裁掉了大概一半的人员,但总 ...
- 【PAT甲级】1016 Phone Bills (25 分)(结构体排序)
题意: 输入24个正整数代表从0到23每个小时通话一分钟花费的美分.输入一个正整数N(<=1000),然后输入N组字符串,每个字符串包含客户的名字和通话的时刻以及打出或者挂断的状态. 按照字典序 ...
- 从Uber司机只是合同工看,零工经济将受沉重打击?
Uber自诞生以来,就始终处于漩涡之中--与当地的同类平台斗.创始人出现负面新闻.司机不断抗议--而就在近日"流血上市"后,Uber也没能迎来好时光.反而是股价不断下跌,市值疯狂蒸 ...
- 八大排序算法C++代码实现
八大排序算法 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序 ...