Hibernate中Inverse和Cascade
Inverse和cascade是Hibernate映射中最难掌握的两个属性。两者都在对象的关联操作中发挥作用。 1.inverse属性:inverse所描述的是对象之间关联关系的维护方式。 inverse只存在于集合标记的元素中。Hibernate提供的集合元素包括<set/> <map/> <list/> <array /> <bag /> Inverse属性的作用是:是否将对集合对象的修改反映到数据库中。 inverse属性的默认值为false,表示对集合对象的修改会被反映到数据库中 inverse=”true” 表示对集合对象的修改不会被反映到数据库中。 <one-to-many>中inverse的属性的设置
例:Person中包含一个Child集合,Child包含一个Person对象。
要求:新建Person和Child对象,Child属于此Person对象
分析:在数据库中,就是新增一条Child记录
//one-to-many的inverse的配置 public void testInverse() {
Qx qx = new Qx();
qx.setQx("天山区");
Jd jd = new Jd();
jd.setJd("人民路");
qx.getJds().add(jd);
jd.setQx(qx); super.add(qx); super.add(jd);
}
配置Inverse=”false”,Hibernate的操作:
(1)Hibernate: insert into TBL_QX (qx) values (?)
(2)Hibernate: insert into TBL_JD (jd, qxid) values (?, ?)
(3)Hibernate: update TBL_JD set qxid=? where jdid=?
配置Inverse=”true”,Hibernate的操作
(1)Hibernate: insert into TBL_QX (qx) values (?)
(2)Hibernate: insert into TBL_JD (jd, qxid) values (?, ?)
可以看出:Inverse=”true”,SQL少执行一条更新操作(Java代码不会少) <many-to-many>中inverse的属性的设置
在多对多的关系中,可以在关联的两边都不设置inverse属性(默认的false),那么说明关联的双方都可以维护两个对象之间的关联关系。
注:在设置多对多关系的inverse属性时,不能两个对象都将其设置为true 2.cascade属性 cascade属性的作用是描述关联对象进行操作时的级联特性。因此,只有涉及到关系的元素才有cascade属性。
具有cascade属性的标记包括<many-to-one /> <one-to-one /> <any /> <set /><bag /> <idbag /> <list /> <array />
注意:<ont-to-many />和 <many-to-many />是用在集合标记内部的,所以是不需要cascade属性的。
级联操作:指当主控方执行某项操作时,是否要对被关联方也执行相同的操作。 3.inverse和cascade的区别
作用的范围不同: Inverse是设置在集合元素中的。 Cascade对于所有涉及到关联的元素都有效。 <many-to-one/><ont-to-many/>没有inverse属性,但有cascade属性
执行的策略不同 Inverse 会首先判断集合的变化情况,然后针对变化执行相应的处理。 Cascade 是直接对集合中每个元素执行相应的处理
执行的时机不同 Inverse是在执行SQL语句之前判断是否要执行该SQL语句 Cascade则在主控方发生操作时用来判断是否要进行级联操作
执行的目标不同 Inverse对于<ont-to-many>和<many-to-many>处理方式不相同。
对于<ont-to-many>,inverse所处理的是对被关联表进行修改操作。
对于<many-to-many>,inverse所处理的则是中间关联表 Cascade不会区分这两种关系的差别,所做的操作都是针对被关联的对象。
总结: <one-to-many>中,建议inverse=”true”,由“many”方来进行关联关系的维护 <many-to-many>中,只设置其中一方inverse=”false”,或双方都不设置 Cascade,通常情况下都不会使用。特别是删除,一定要慎重
Hibernate中Inverse和Cascade相关推荐
- Hibernate中inverse属性与cascade属性
Hibernate集合映射中,经常会使用到"inverse"和"cascade"这两个属性.对于我这样,Hibernate接触不深和语文水平够烂的种种因素,发现 ...
- 关于Hibernate中inverse=true的转载
1.到底在哪用cascade="..."? cascade属性并不是多对多关系一定要用的,有了它只是让我们在插入或删除对像时更方便一些,只要在cascade的源头上插入或是删除,所 ...
- 在 Hibernate 中inverse的属性
hibernate配置文件中有这么一个属性inverse,它是用来指定关联的控制方的. inverse属性默认是false,若为false,则关联由自己控制,若为true,则关联 由对方控制. 见例子 ...
- java inverse_简要分析java中inverse和cascade有何区别
在java开发的过程中,inverse和cascade的作用或许有些人比较清楚,而另外有的人感到陌生,究竟两者之间有没有关系?正如它们又都能影响对象关联关系的维护,所以将这两个属性的作用区分开也不是很 ...
- Hibernate【inverse和cascade属性】知识要点
Inverse属性 Inverse属性:表示控制权是否转移.. true:控制权已转移[当前一方没有控制权] false:控制权没有转移[当前一方有控制权] Inverse属性,是在维护关联关系的时候 ...
- Hibernate关键字inverse和cascade
2019独角兽企业重金招聘Python工程师标准>>> 维护关联关系中,是否设置inverse属性: 1. 保存数据 有影响. 如果设置控制反转,即 ...
- 关于hibernate中invers跟cascade的一点看法
下午动手配了下一个简单的双向一对多关系 一下子居然想不起invers跟cascade的区别了 看了网上那些东西觉得更迷茫了 说invers是维护2个表之间的关系的 但是cascade也是2个表的级联操 ...
- hibernate中inverse作用
默认 inverse="false"即该元素指向的类负责维护该关系. 如: <hibernate-mapping> <class name="com.h ...
- Hibernate中的级联策略和object references an unsaved transient instance - save the transient instance before
本片博文整理关于Hibernate中级联策略cascade和它导致的异常: Exception in thread "main" org.hibernate.TransientOb ...
最新文章
- Python 统计列表中元素出现的次数
- vant coupon 时间戳如何计算_计软考研双日练 | 如何计算拓扑排序算法的时间复杂度?...
- 排个课表学会了拓扑排序!有点意思
- 《Hadoop MapReduce实战手册》一1.4 给WordCount MapReduce程序增加combiner步骤
- ssh连接阿里云服务器遇到的坑
- php chr 乱码,php chr() ord()中文截取乱码问题解决方法_PHP教程
- 4-1 AlexNet神经网络
- 【编程珠玑】第十章 节省空间
- PHP核心技术与最佳实践 读书笔记 第二章 面向对象的设计原则
- LevelDB源码之五Current文件\Manifest文件\版本信息
- 阿里开源框架Jarslink1.6.1新特性
- 计算机开机无法定位,开机提示无法定位程序输入点...于动态链接库CommFunc.dll上...
- 使用直播网站源码,搭建直播平台的最难点
- tomcat内存溢出:PermGen space解决方法
- 基于支持向量机的图像分类系统(MATLAB GUI界面版)
- html5一个圆圈旋转,Javascript实现可旋转的圆圈实例代码
- AR涂涂乐⭐三、 C#实现识别图进入扫描框显示绿色,未进入为红色功能
- 有一牧场,已知养牛27头,6天把草吃尽;养牛23头,9天把草吃尽。如果养牛21头,那么几天能把牧场上的草吃尽呢?并且牧场上的草是不断生长的。
- 神舟笔记本电脑降低声音
- 苹果平板的笔有必要买吗?适用于苹果平板的手写笔推荐
热门文章
- QT的QFileDialog类的使用
- C++Opengl绘制三角形源码
- c++标准I/O输出流
- 经典C语言程序100例之八七
- 海外对鸿蒙的态度,谷歌、三星挑明态度,国内厂商集体拒绝鸿蒙?任正非将如何应对?...
- 怎么查看linux挂载的硬盘,如何查看Linux服务器已挂载的硬盘
- java个人介绍代码_个人项目WC(Java)
- 'gbk' codec can't decode byte 0x80 in position的一个解决办法
- Freemarker中如何遍历List
- Android与服务进程内通信