• 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多表操作&级联&外键维护的更多相关文章

  1. mysql之字段的修改,添加、删除,多表关系(外键),单表详细操作(增删改)

    字段的修改.添加和删除 create table tf1( id int primary key auto_increment, x int, y int ); #修改 alter table tf1 ...

  2. Django学习——Django测试环境搭建、单表查询关键字、神奇的双下划线查询(范围查询)、图书管理系统表设计、外键字段操作、跨表查询理论、基于对象的跨表查询、基于双下划线的跨表查询

    Django测试环境搭建 ps: 1.pycharm连接数据库都需要提前下载对应的驱动 2.自带的sqlite3对日期格式数据不敏感 如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3 ...

  3. hibernate多表操作

    一.表之间的关系 1.一对一 2.一对多 3.多对多 二.表之间关系建表原则 1.一对多:在多的一方创建一个外键,指向一的一方的主键 2.多对多:创建一个中间表,中间表至少有两个字段,分别作为外键指向 ...

  4. Oracle表中添加外键约束

    添加主键约束: ALTER TABLE GA_AIRLINE ADD CONSTRAINT PK_AIRLINE_ID PRIMARY KEY(AIRLINE_ID); 有三种形式的外键约束: 1.普 ...

  5. 在PowerDesigner中设计物理模型1——表和主外键

    原文:在PowerDesigner中设计物理模型1--表和主外键 在PD中建立物理模型由以下几种办法: 直接新建物理模型. 设计好概念模型,然后由概念模型生成物理模型. 设计好逻辑模型,然后由逻辑模型 ...

  6. SQL-46 在audit表上创建外键约束,其emp_no对应employees_test表的主键id。

    题目描述 在audit表上创建外键约束,其emp_no对应employees_test表的主键id.CREATE TABLE employees_test(ID INT PRIMARY KEY NOT ...

  7. SQL SERVER中获取表间主外键关系

    sql server 2008中的主外键关系获取方式: 转自:http://www.cnblogs.com/ke10/archive/2012/06/11/2544655.html SELECT OB ...

  8. 在PowerDesigner中设计物理模型1——表和主外键(转)

    出处:http://www.cnblogs.com/studyzy/archive/2009/12/15/1624899.html 在PD中建立物理模型由以下几种办法: 直接新建物理模型. 设计好概念 ...

  9. Python3-sqlalchemy-orm 联表查询-无外键关系

    #-*-coding:utf-8-*- #__author__ = "logan.xu" import sqlalchemy from sqlalchemy import crea ...

随机推荐

  1. C语言-断言

    1 作用: 断言常做语言处理的高级形式,自动处理软件隐藏很深其且它手段不易发现的错误,快速进行异常定位.同时这也是软件单元测试必须的技术. 2 使用范围: 2.1放在函数入口对入口参数进行合法性检查( ...

  2. 重装VisualSVN Server报错

    由于eclipse无法连接SVN服务器,尝试着重装SVN,安装到一半时,弹出如下图所示错误: 打开提示窗口输入services.msc,进入服务界面: 发现VisualSVN Server服务无法启动 ...

  3. Update(Stage4):Spark原理_运行过程_高级特性

    如何判断宽窄依赖: =================================== 6. Spark 底层逻辑 导读 从部署图了解 Spark 部署了什么, 有什么组件运行在集群中 通过对 W ...

  4. Linux服务器yum安装mysql

    阿里云Linux 服务器安装mysql 可以用rpm 和yum 方式安装,我这次安装是采用yum方式安装 请直接复制以下链接,看安装步骤 https://www.cnblogs.com/nzplear ...

  5. Vue项目的准备

    1.下载nodejs 检查是否安装成功 2.使用gitee作为线上仓库 3.使用脚手架工具--命令行工具 能在8080里显示出以下画面即为成功

  6. golang的io.copy使用

    net/http 下载 在golang中,如果我们要下载一个文件,最简单的就是先用http.get()方法创建一个远程的请求后,后面可使用ioutil.WriteFile()等将请求内容直接写到文件中 ...

  7. WEB - token

    token概念参考 https://ninghao.net/blog/2834 https://stackoverflow.com/questions/1592534/what-is-token-ba ...

  8. 笔记-redis-订阅系统

    笔记-redis-订阅系统 1.      发布/订阅pub/sub 1.1.  基本命令 PUBLISH channel message #将信息发送到指定的频道. SUBSCRIBE channe ...

  9. Apache Shiro安全(权限框架)学习笔记二

    课程目标 通过学习本课程掌握权限管理的设计思想及方法,使用Shiro框架完成权限管理功能开发. 1.  理解基于资源的权限管理方法. 2.  掌握权限管理的数据模型. 3.  掌握不使用shiro开发 ...

  10. nginx 反向代理memcached、websocket及nginx文件方面的优化

    安装memcached服务,并启动添加数据 yum -y install memcached systemctl start memcached.service 启动 [root@python ~]# ...