具体解释Hibernate中cascade与inverse
学习hibernate的时候对级联关系的概念老是分不清楚,尤其是cascade、inverse傻傻分不清。以下通过样例来简单说明。
准备工作: 
     首先创建数据库,新建两张表: 
                教室表classes (字段此处省) 
                学生表student(字段此处省) 
教室与学生是一对多的关系。 然后新建项目,加入hibernate对两张表的支持。
1.cascade
cascade表示级联操作。即两个实体间存在级联关系(一个类是还有一个类中的属性)时,当保存、更新或删除一个实体时,是否对关联的实体做出相应操作(数据库操作),比如: 
保存班级级联保存学生:
在Classes.hbm.xml配置文件里做例如以下改动: 
 
如今运行例如以下的代码: 
 
这样在保存classes的时候的时候会自己主动在数据库中加入两个新学生。 
 说明:
- 在hibernate中,通过session.save方法保存一个持久化对象这样的方式称为显示保存。
 - 在hibernate中,通过级联的方式来操作一个对象。这样的方式称为隐式操作。
 - 对student对象进行了隐式的保存操作,是由于student是一个暂时状态的对象。在数据库中没有相应的记录,所以应该对student运行insert语句
 
更新班级级联更新学生:
说明:
- 当运行108行的时候,产生了例如以下的sql语句
 
- 在运行110行代码的时候,产生了例如以下的sql语句
 
- 运行114行代码的时候。产生了例如以下的sql语句
 
该update语句产生了3条,由于该班级中有3个学生,3个学生的属性同一时候发生改变。
- 没有发出更新classes的update语句。由于classes的属性没有发生改变。
 
删除班级级联删除学生: 
设置Classes.hbm.xml的Cascade为Delete 
此时此classes包括的所以的student都一并删除了。注意在假设不设置级联删除则无法删除被外键引用的对象。
总结 
 Cascade:
- Save-update
 
在session.save/update一个对象的时候,级联操作关联对象,关联对象或者运行save语句或者运行update语句或者什么都不运行- Delete
 
在session.delete一个对象的时候,级联删除关联对象- All
 
Save-update和delete的结合
2.inverse
inverse属性用于指示本方是否參与维护关系。设为true时不维护,设为false时维护。
此处的关系是指关联两张表的
外键或者关系表字段。
本属性一般设置于一对多关系中的一端。而且设置为false。由于若由一端负责维护,每次更新完一端数据,都会去寻找于一端有关系的多段表中的行,并更新其外键字段。而由多端维护时。由于一端对象是多端对象的属性字段,所以,每次更新多端后提交数据。都会自己主动更新该字段(若有更新时),这样比較方便。
3.Cascade与inverse的差别 student 与 classes
- cascade描写叙述的是对象与对象之间的关系
 
cascade和外键没有关系,在student表中。sid、name、description和cascade有关系,可是cid和cascade没有关系。
- inverse描写叙述的是对象与外键之间的关系
 
inverse仅仅和cid有关系。假设维护。则发出update语句(更新外键的sql语句)。假设不维护,则无论。
- inverse属性默认是false的,就是说关系的两端都来维护关系。当设置inverse=”true”时则不维护
 
4.仅仅有inverse没有cascade的时候:
对于数据中不存在的classes和student时:把student设置给classes时,仅仅保存classes而不直接保存student时仅仅会运行insert classes的方法而对于student(即使不存在)不会insert而仅仅会update(由于在同一个事物中所以终于导致classes也不能被保存)
当要保存的classes设置的student是数据库中存在的时候,会对其运行update方法,而假设对classes设置了cascade,则会对不存在的student设置insert:
当给classes设置inverse=”true”时。则表示classes不维护和student的外键关系。此时当删除一个classes时,由于classes不维护与student的关系,顾不会发出update语句所以会报错。而假设classes没有设置inverse=”true”,即inverse=”false”,则说明classes维护关系。故当删除classes时会发出update student的语句,故能够删除成功.
5.正确的设置inverse
我们说inverse设立不当会导致性能低下,事实上是说inverse设立不当,会产生多余反复的SQL语句甚至致使JDBC exception的throw。
这是我们在建立实体类关系时必须须要关注的地方。
一般来说,inverse=true是推荐使用,双向关联中两方都设置 inverse=false的话,必会导致两方都反复更新同一个关系。
可是假设两方都设立inverse=true的话,两方都不维护关系的更新,这也是不行的,好在一对多中的多端:one-to-many默认是inverse=false,避免了这样的错误的产生。可是多对多就没有这个默认设置了,所以非常多人常常在多对多的两端都使用inverse=true,结果导致连接表的数据根本没有记录,就是由于他们两方都没有责任维护关系。所以说,双向关联中最好的设置是一端为inverse=true。一端为inverse=false。一般inverse=false会放在多的一端,那么有人提问了。 many-to-many两边都是多的。inverse究竟放在哪儿?事实上hibernate建立多对多关系也是将他们分离成两个一对多关系,中间连接一个连接表。
所以通用存在一对多的关系。也能够这样说:一对多是多对多的基本组成部分。
具体解释Hibernate中cascade与inverse的更多相关文章
- hibernate中cascade和inverse
		
原文:http://blog.sina.com.cn/s/blog_7b9edd020100racc.html 这两个属性都用于一多对或者多对多的关系中. 而inverse特别是用于双向关系,在单向关 ...
 - 转 Hibernate中cascade和inverse的作用
		
Inverse和cascade是Hibernate映射中最难掌握的两个属性.两者都在对象的关联操作中发挥作用.1.明确inverse和cascade的作用inverse 决定是否把对对象中集合的改动反 ...
 - Hibernate中cascade和inverse的作用
		
Inverse和cascade是Hibernate映射中最难掌握的两个属性.两者都在对象的关联操作中发挥作用.1.明确inverse和cascade的作用inverse 决定是否把对对象中集合的改动反 ...
 - Hibernate中cascade作用
		
Hibernate中cascade作用 只有“关系标记”才有cascade属性: 一个操作因级联cascade可能触发多个关联操作.前一个操作叫“主控操作”,后一个操作叫“关联操作”. cascade ...
 - hibernate中cascade属性以及inverse属性
		
级联操作 cascadecascade的常用属性值 none 默认值 不做任何变动 save-update 保存或修改 delete 删除 all 包含save-update 和delete等行为 c ...
 - 具体解释Hibernate中的二级缓存
		
1.前言 这篇博客再前几篇博客的基础上来解说一下.Hibernate中的二级缓存.二级缓存是属于SessionFactory级别的缓存机制. 第一级别的缓存是Session级别的缓存,是属于事务范围的 ...
 - java之hibernate之 cascade和inverse
		
1.Cascade是级联动作,在many_to_one中如果使用cascade可以级联操作关联对象,如下代码可以级联保存Category对象. 在Book的映射文件设置 <many-to-one ...
 - 具体解释Hibernate中的事务
		
1.前言 上一篇博客解说了Hibernate中的一级缓存,属于Session级别的.这篇博客解说一下Hibernate中的事务机制. 有关事务的概念.请參照通俗易懂数据库中的事务. 2.怎样处理Hi ...
 - Hibernate中cascade属性的区别
		
xml对于集合的级联操作属性cascade的取值可以是: none: 不级联操作,默认为none save-update:针对的是当对当前对象进行save或update操作时,要对想关联的对象进行sa ...
 
随机推荐
- performSelector  多个参数
			
[self performSelector:@selector(callFooWithArray) withObject:[NSArray arrayWithObjects:@"first& ...
 - Spring+mybatis+postgresql整合
			
最近做了一个项目,需要使用Spring+mybatis+postgresql,下面记录一下整合步骤: 一.准备JAR包: 我使用的是maven,所以直接晒出pom.xml <project xm ...
 - MAC快捷方式记录
			
刚刚转到MAC,很多功能发现不能用,总结一下: 刷新页面:command+r 命令行,到行首:control+a 命令行,到行尾:control+e vim,到行尾:shift+$ vim,到行首:s ...
 - Android开之在非UI线程中更新UI
			
当在非UI线程中更新UI(程序界面)时会出现例如以下图所看到的的异常: 那怎样才干在非UI线程中更细UI呢? 方法有非常多种.在这里主要介绍三种: 第一种:调用主线程mHandler的post(Run ...
 - 升级Linux内核导致vmware无法使用(vmnet模块无法编译)解决方式
			
近期将ubuntu升级到了14.04,出现了vmware无法启动的情况. 详细表现为:每次启动的时候都会弹出一个VMWare Kernel Module Updater的对话框,要求依据当前内核版本号 ...
 - 把文件(项目)上传到Git@OSC
			
说明: 登录与配置git的操作此处忽略. 假设你已配置好git,并且已绑定oschina. 下面是把一个本地文件夹上传到git的操作: 在git@osc上新建项目.记得选择添加对应的 .gitigno ...
 - 【Zookeeper】源码分析之持久化(三)之FileTxnSnapLog
			
一.前言 前面分析了FileSnap,接着继续分析FileTxnSnapLog源码,其封装了TxnLog和SnapShot,其在持久化过程中是一个帮助类. 二.FileTxnSnapLog源码分析 2 ...
 - 顺利编译 binutiles-gcc-glibc
			
恩,前面一篇弃了,先知道怎么能成功,还有要避开哪些坑,然后再去仔细研究到底咋回事. 这里顺利编译 arm-lfs-linux-gnueabi , 参考了下面的资料: 1. <Linux From ...
 - Java程序监控指标
			
监控指标: 1.CPU平均使用率 2.内存平均使用率 3.应用程序错误数 4.应用程序请求量 5.应用平均响应时间 6.硬件I/O指标 7.JMX 7.1.Full gc count 7.2.Full ...
 - java 从spring容器中获取注入的bean对象
			
java 从spring容器中获取注入的bean对象 CreateTime--2018年6月1日10点22分 Author:Marydon 1.使用场景 控制层调用业务层时,控制层需要拿到业务层在 ...