六 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
多对多其他操作:
- 给用户选择角色
- 给用户改选角色
- 给用户删除角色
最新文章
- windows go安装
- 「视频直播技术详解」系列之七:直播云 SDK 性能测试模型
- @RequestMapping用法详解
- 狼抓兔子(bzoj 1010)
- Logistic Regression Vs Decision Trees Vs SVM: Part I
- JS源码(条件的判定,循环,数组,函数,对象)整理摘录
- 一个高级PHP工程师所应该具备的
- java—— 调用系统命令
- 转:fopen与open可以转换吗
- Linux - How To Set Up an NFS Mount on CentOS 6
- html标签的嵌套规则分析
- 关于php网络爬虫phpspider。
- Linux(CentOS6.5)下Nginx注册系统服务(启动、停止、重启、重载等)&;设置开机自启
- Liunx系统下的进程与线程
- django上传excel文件
- 【EF6学习笔记】(四)弹性连接及命令拦截调试
- python-元类的几种单例模式
- JavaScript基础笔记(二)变量、作用域和内存问题
- IIC基本概念和基本时序
- Android Studio开发第二篇创建新项目
热门文章
- Red Black Tree(红黑树)
- struct和class定义类的区别
- nginx windows下重新加载配置
- Java的进制转换
- Servlet 学习(三)
- ApacheDbUtilsUpdate
- Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)E(多重集维护)
- 【PAT甲级】1018 Public Bike Management (30 分)(SPFA,DFS)
- Java-用星号打印菱形
- Vue源码(上篇)