Hibernate级联操作解密(inverse和cascade)
总结:
Cascade:对级联操作进行限制,有如下几个参数:
all : 所有情况下均进行关联操作。
none:所有情况下均不进行关联操作。这是默认值。
save-update:在执行save/update/saveOrUpdate时进行关联操作。
delete:在执行delete时进行关联操作。
Inverse:在一对多模型中,只能在一的一方设置,inverse的作用就是在级联发生后,会再次更新子表数据的外键为主表的主键。确保子表外键不会为空。
下面演示一个班级学生的例子(一对多):
班级表javabean
public class Classes {
private Integer c_id;
private String c_name;
private String c_desc;
private Set<Student> student;
...}
班级表mapping
.....其他字段省略,只写关联部分的代码
<set name="student" table="STUDENT" cascade="save-update" inverse="false" lazy="true">
<key>
<column name="C_ID" />//此处对应子表外键约束名
</key>
<one-to-many class="com.cky.model.Student" />
</set>
学生表bean如下
public class Student {
private Integer s_id;
private String s_name;
private Integer s_age;
private Classes cls;
....}
学生表mapping
...其他字段省略,只写关联部分的代码
<many-to-one name="cls" cascade="save-update" class="com.cky.model.Classes" fetch="join">
<column name="C_ID" />//自己的外键约束名
</many-to-one>
Classes 和Student是一对多关系,验证inverse作用
1、当classes的 descade=”save-update” inverse=”false”或者不写(默认false)
执行如下操作:
Student st1=new Student("st1", 11);
Student st2=new Student("st2", 17);
Set<Student> stus=new HashSet<Student>();
stus.add(st1);
stus.add(st2);
//上面是创建两个学生对象,并添加到stus集合中
//下面是创建classes对象,并将学生集合传入
Classes cls=new Classes("班级1", "lal", stus);
ss.save(cls);
执行结果:注意最后的两个更新操作
Hibernate: select max(C_ID) from CLASSES
Hibernate: select max(S_ID) from STUDENT
Hibernate: insert into CLASSES (C_NAME, C_DESC, C_ID) values (?, ?, ?)
Hibernate: insert into STUDENT (S_NAME, S_AGE, C_ID, S_ID) values (?, ?, ?, ?)
Hibernate: insert into STUDENT (S_NAME, S_AGE, C_ID, S_ID) values (?, ?, ?, ?)
Hibernate: update STUDENT set C_ID=? where S_ID=?
Hibernate: update STUDENT set C_ID=? where S_ID=?
二、当classes的 descade=”save-update” inverse=”true”时
执行结果:注意没有update了
Hibernate: select max(C_ID) from CLASSES
Hibernate: select max(S_ID) from STUDENT
Hibernate: insert into CLASSES (C_NAME, C_DESC, C_ID) values (?, ?, ?)
Hibernate: insert into STUDENT (S_NAME, S_AGE, C_ID, S_ID) values (?, ?, ?, ?)
Hibernate: insert into STUDENT (S_NAME, S_AGE, C_ID, S_ID) values (?, ?, ?, ?)
从结果可以看出来,当放弃维护关系的时候,少了两个更新语句
Inverse:是否放弃维护关系,就是是否对子表外键的进行额外更新操作,保证子表外键是自己的主键。
当级联发生时,有两种情况:
1、如果inverse为false,即classes选择维护关系的话。首先级联添加时会把Student对象的值插入表,由于需要维护关系,所以他会再次更新这些数据的外键关系。
将外键更新成自己的主键,这样他们一定有关系了。
2、如果inverse为true,即classes不维护关系,首先级联添加时会把Student对象的值插入表,但不会再次更新这些数据的外键关系,如果数据没有外键,就是空的,所以可以看到第二次执行中,由于我们创建Student对象时没有指定classes,所以添加后表中的结果也是null。
总结:inverse只能在一的一方设置,inverse的作用就是在级联发生时,会再次更新子表数据的外键为主表的主键。确保子表外键不会为空。
正常情况都是将inverse设置成true来加快速度,子表数据的外键在创建子表对象时就设置好。
Hibernate级联操作解密(inverse和cascade)的更多相关文章
- Hibernate级联操作和载入机制(二) cascade and fetch
上一篇介绍了Hibernate持久化对象时候的级联操作.本篇介绍读取时候的级联操作. 还是用上一篇的样例.一份问卷有多个问题.可是每一个问题仅仅能属于一份问卷. 我们先看測试用例: @Test pub ...
- Hibernate级联操作 注解
EJB3 支持的操作类型 /** * Cascade types (can override default EJB3 cascades */ public enum CascadeType { AL ...
- Hibernate级联操作
cascade属性的可能值有 all: 所有情况下均进行关联操作,即save-update和delete. none: 所有情况下均不进行关联操作.这是默认值. save-update: 在执行sav ...
- springdata 一对多 级联操作 在注解里面开启级联操作@OneToMany(mappedBy = "customer",cascade = CascadeType.ALL)
- Hibernate的Cascade——级联操作
在Hibernate中,针对持久化实体的配置文件中有Cascade这样一个属性,顾名思义就是级联,也就是说在操作当 前实体时,针对当前实体的操作会影响到相应配置的关联实体.比如针对当前实体进行保存操作 ...
- [原创]关于Hibernate中的级联操作以及懒加载
Hibernate: 级联操作 一.简单的介绍 cascade和inverse (Employee – Department) Casade用来说明当对主对象进行某种操作时是否对其关联的从对象也作类似 ...
- hibernate级联 cascade属性(转)
在Hibernate中,针对持久化实体的配置文件中有Cascade这样一个属性,顾名思义就是级联,也就是说在操作当 前实体时,针对当前实体的操作会影响到相应配置的关联实体.比如针对当前实体进行保存操作 ...
- Hibernate 集合映射 一对多多对一 inverse属性 + cascade级联属性 多对多 一对一 关系映射
1 . 集合映射 需求:购物商城,用户有多个地址. // javabean设计 // javabean设计 public class User { private int userId; privat ...
- 【SSH三大框架】Hibernate基础第九篇:cascade关联关系的级联操作
这里要说的是Hibernate的关联关系的级联操作,使用cascade属性控制. 依旧用部门和员工举例.多个员工相应一个部门(多对一关联关系) 员工类:Employee.java package cn ...
随机推荐
- 关于移动APP与Web APP的测试重点以及区别
Web app测试重点: 1. 功能测试:功能的实现是否满足需求. 2. 性能测试: 2.1 链接速度测试:测试页面链接的速度 2.2 负载测试:web应用系统能允许多少个用户同时在线?超过这个数量会 ...
- java 关键字final
一.最终的意思,可以修饰类,方法,变量.特点: A:它修饰的类,不能被继承. B:它修饰的方法,不能被重写. C:它修饰的变量,是一个常量.二.面试相关: 1.局部变量基本类型 值不能发生改变 例如: ...
- 增强for循环赋值
增强for循环赋值 代码如下: double[] testList01 = new double[5]; java.util.Scanner sc = new java.util.Scanner(Sy ...
- Android Studio2.1 Run APP:Error: Execution failed for task
Android Studio2.1 Run APP时,遇到错误 Error: Execution failed for task ':app:clean'. Unable to delete file ...
- 本地存储之cookie、localStorage、sessionStorage
一.本地存储分为cookie,以及新增的localStorage和sessionStorage 1.cookie存储在本地,容量最大4k,在同源的http请求时携带传递,损耗带宽,可设置访问路径,只有 ...
- NLP —— 图模型(零):EM算法简述及简单示例(三硬币模型)
最近接触了pLSA模型,该模型需要使用期望最大化(Expectation Maximization)算法求解. 本文简述了以下内容: 为什么需要EM算法 EM算法的推导与流程 EM算法的收敛性定理 使 ...
- 一个爬取Bing每日壁纸的python脚本
1. 背景 Bing搜索每天的背景图片有些比较适合做桌面,但是有的提供下载有的不提供下载.每天去点击下载又不太方便,所以第一次学习了一下python爬虫怎么写,写的很简单. 2. 相关技术 2.1 P ...
- (转)Linux开机启动(bootstrap)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 计算机开机是一个神秘的过程.我们只是按了开机键,就看到屏幕上的进度条或者一行行的输 ...
- arcgis for javascript 自定义infowindow
arcgis 自己的infowindow 太难看了,放在系统中与系统中的风格格格不入,在参考了网上的一些资料后,整理编写了适合自己系统的infowindow,与大家分享. 1.自定义展示效果 2.In ...
- HTML5 开发APP(MUI的一些特性)
先附mui文档地址:http://dev.dcloud.net.cn/mui/ui/ .mui的UI组件比较简单而且在文档中很好找就不过多说了. 1 在app开发中,使用HTML5+的api,必须m ...