Hibernate【inverse和cascade属性】知识要点
Inverse属性
Inverse属性:表示控制权是否转移..
- true:控制权已转移【当前一方没有控制权】
- false:控制权没有转移【当前一方有控制权】
Inverse属性,是在维护关联关系的时候起作用的。只能在“一”的一方中使用该属性!Inverse属性的默认值为fasle,也就是当前一方是有控制权的
从一下的几个方面看看Inverse在维护关联关系时是否起作用:
- 保存数据
- 获取数据
- 解除关联关系
- 删除数据对关联关系的影响
保存数据
将inverse属性设置为ture,使dept没有控制权
<!--维护关系的是Set集合,对应employee表-->
<set cascade="save-update" name="set" table="employee" inverse="true">
执行保存数据操作时,发现Hibernate只执行了三条SQL语句。employee表的外键并没有数据
结论:如果设置控制反转,即inverse=true, 然后通过部门方维护关联关系。在保存部门的时候,同时保存员工, 数据会保存,但关联关系不会维护。即外键字段为NULL
查询数据
设置inverse属性为true,那么部门一方是没有控制权的。
<set cascade="save-update" name="set" table="employee" inverse="true">
我们在查看数据的时候,发现inverse属性对查询数据是没有影响的
//查询出Dept对象
Dept de = (Dept) session.get(Dept.class, 1);
System.out.println(dept.getDeptName());
System.out.println("-----------");
//用到的时候再查询数据库,Hibernate的懒加载【后面会讲解】
System.out.println(de.getSet());
解除关联关系
部门和员工是存在外键的联系的,我们接下来看看inverse属性对于解除关联关系有没有影响
- 当部门一方有权限时,即inverse属性为false
//查找部门id为1的信息
Dept dept1 = (Dept) session.get(Dept.class, 1);
//清除关联信息
dept1.getSet().clear();
可以解除关联关系,employee的外键字段被设置为NULL了
- 当部门一方没有权限时,即inverse属性为true
//查找部门id为2的信息
Dept dept1 = (Dept) session.get(Dept.class, 2);
//清除关联信息
dept1.getSet().clear();
不能解除关联关系
删除数据对关联关系的影响
- 当部门一方有权限时,即inverse属性为false
//查找部门id为2的信息
Dept dept1 = (Dept) session.get(Dept.class, 2);
//删除部门2
session.delete(dept1);
当有控制权的时候可以删除数据,先把外键设置为NULL,再删除数据!
- 当部门一方没有权限时,即inverse属性为true
//查找部门id为1的信息
Dept dept1 = (Dept) session.get(Dept.class, 1);
//删除部门1
session.delete(dept1);
直接抛出异常,说该部门拥有外键,不能删除数据!
cascade属性
cascade表示级联的意思,简单来说就是操作某一属性时,对其他关联字段的影响
casecade属性不像inverse属性只能在“一”的一方设置,它可以在“一”的一方也可以在“多”的一方设置
cascade有这么几个值
- none 不级联操作, 默认值
- save-update 级联保存或更新
- delete 级联删除
- save-update,delete 级联保存、更新、删除
- all 同上。级联保存、更新、删除
级联保存
级联保存有什么用呢???我们来看个例子:
- 如果在保存对象的时候,没有把相关的对象也一并保存进数据库,会出现错误。
- 因为它会发现dept是有外键的,而外键又是一个对象来保存着,这个对象在数据库表中并没有存在,因此会抛出异常
//创建对象
Dept dept = new Dept();
dept.setDeptName("开发部");
Employee zs = new Employee();
zs.setEmpName("张珊");
zs.setSalary(1111);
Employee ls = new Employee();
ls.setEmpName("李四");
ls.setSalary(2222);
//维护关系
dept.getSet().add(zs);
dept.getSet().add(ls);
//保存dept对象
session.save(dept);
如果我们在dept中设置了级联保存,那么Hibernate就会知道:保存dept的数据时,发现dept了外键,也把dept外键的对象保存在数据库之中
<set name="set" table="employee" cascade="save-update" >
级联删除
级联删除,这个对于我们来说风险太大了,如果删除了某些数据,会把另外有关联的数据也删除...在实际中我们一般不使用!
- 在没有设置级联删除的时候,我们试试删除dept
//删除部门为3的记录
Dept dept1 = (Dept) session.get(dept.getClass(), 3);
session.delete(dept1);
它会先把3的外键对应的记录删除,再删除部门的数据
- 在设置级联删除的时候,我们试试删除dept
<set name="set" table="employee" cascade="save-update,delete" >
- 级联删除数据
//删除部门为4的记录
Dept dept1 = (Dept) session.get(dept.getClass(), 4);
session.delete(dept1);
我们发现数据相关联的数据都没有了
cascade和inverse同时使用
上面我们已经把cascade和inverse都介绍一遍了,那么cascade和inverse同时使用会怎么样呢???我们来测试一下
- 设置dept没有控制权,但设置级联保存、删除
<set name="set" table="employee" cascade="save-update,delete" inverse="true" >
- 添加一个dept对象
//添加一个dept对象
session.save(dept);
如果我们单单设置了inverse属性为true,那么数据库中肯定是不能维护关联关系的【这里我们已经测试了】
但是呢,现在也设置了级联保存,级联保存是否可以让该对象相关的关联关系一并保存在数据库中的。
我们来看看结果:
inverse的优先级是比cascade的优先级要高的,因此设置了inverse属性为true,那么cascade就无效了。
参考详细博文:
http://www.cnblogs.com/whgk/p/6135591.html
ascade和inverse总结
上面的测试都是通过几个方面的,看起来有点多,因此我们总结一下
inverse属性
inverse属性只能在“一”的一方中设置。inverse=false表示有控制权,inverse=ture表示没有控制权
- 在保存关联信息时
- 有控制权--->可以保存相对应的关联数据
- 没有控制权--->数据会保存,但是关联关系没有维护,也就是外键列为NULL
- 在查询数据时
- 有无控制权对查询数据没有任何影响
- 在解除关联关系时
- 有控制权--->可以解除关联关系
- 没有控制权--->不能解除关联关系,不会生成update语句,也不会报错
- 在删除数据时对关联关系的影响
- 有控制权--->将外键的值设置为NULL,随后删除数据
- 没有控制权--->如果删除的记录有被外键引用,会报错,违反主外键引用约束,如果删除的记录没有被引用,可以直接删除。
多对多关系的时候也是一样的,只不过多对多的关联关系是在中间表中
cascade属性
cascade有这么几个值:
- none 不级联操作, 默认值
- save-update 级联保存或更新
- delete 级联删除
- save-update,delete 级联保存、更新、删除
- all 同上。级联保存、更新、删除
我们可能使用到的往往是:save-update这个值,因为级联删除的风险太大了!
- 级联保存
- 没有设置级联保存-->如果单单保存一个对象,而对象又存在外键时,那么就会抛出异常
- 设置了级联保存-->那么就可以将对象以及有关联关系的对象一并保存
- 级联删除
- 没有设置级联删除-->在删除数据的时候,会把外键的字段设置为NULL,再删除当前一方的记录
- 设置了级联删除-->把对象有关联关系的记录都删除了
如果cascade和inverse同时设置时:
- inverse属性优先级是要比cascade要高的,如果inverse属性设置了true,那么cascade就无效了!
如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y
Hibernate【inverse和cascade属性】知识要点的更多相关文章
- Hibernate中的inverse和cascade属性
Hibernate中的inverse和cascade属性 inverse的值有两种,"true"和"false".inverse="false&quo ...
- 一对多(多对一)关系中的inverse和cascade属性
转载请标明出处 http://www.cnblogs.com/haozhengfei/p/6049276.html 首先说一下inverse: "inverse" 直译过来就是&q ...
- Hibernate第五篇【inverse、cascade属性详解】
前言 上一篇博文已经讲解了一对多和多对一之间的关系了,一对多和多对一存在着关联关系(外键与主键的关系).本博文主要讲解Inverse属性.cascade属性.这两个属性对关联关系都有影响 Invers ...
- hibernate:inverse、cascade,一对多、多对多详解
1.到底在哪用cascade="..."? cascade属性并不是多对多关系一定要用的,有了它只是让我们在插入或删除对像时更方便一些,只要在cascade的源头上插入或是删除,所 ...
- (转)Hibernate框架基础——cascade属性
http://blog.csdn.net/yerenyuan_pku/article/details/52760010 我们以部门和员工的关系为例讲解一对多关联关系映射时,删除部门时,如果部门有关联的 ...
- hibernate中一对多关系中的inverse,cascade属性
举例说明: 一对多关系的两张表:boy.girl(一个男孩可以多个女朋友) boy表结构 Field Type ------ ----------- name varcha ...
- Hibernate中inverse属性与cascade属性
Hibernate集合映射中,经常会使用到"inverse"和"cascade"这两个属性.对于我这样,Hibernate接触不深和语文水平够烂的种种因素,发现 ...
- hibernate中cascade属性以及inverse属性
级联操作 cascadecascade的常用属性值 none 默认值 不做任何变动 save-update 保存或修改 delete 删除 all 包含save-update 和delete等行为 c ...
- Hibernate之cascade属性和inverse属性
1.cascade属性 cascade属性的作用是描述关联对象进行操作时的级联特性,只有涉及关系的元素才有cascade属性.具有cascade属性的标记包括<many-to-one/>. ...
随机推荐
- 编程菜鸟的日记-初学尝试编程-C++ Primer Plus 第6章编程练习8
#include <iostream> #include <fstream> #include <cstdlib> const int SIZE=20; using ...
- hadoop2-elasticsearch的安装
本文主要讲elasticsearch-2.2.1的安装过程. 准备工作: 1.搭建虚拟机 你需要先参考 hadoop2集群环境搭建 把你的虚拟机搭建起来-hadoop环境可以先不用搭建(完成步骤1到步 ...
- Rewrite JSON with Fetch
1.重写json请求部分:HTML文件代码如下:<html>......<script> var myList = document.querySelector(‘ul‘); ...
- python中的双向链表实现
引子 双向链表比之单向链表,多数操作方法的实现都没有什么不同,如is_empty, __len__, traverse, search.这些方法都没有涉及节点的变动,也就可通过继承单向链表来实现即可. ...
- 微信小程序开发---逻辑层(App Service)
再说逻辑层之前,先说说微信小程序框架(MINA) 小程序开发框架的目标是通过尽可能简单.高效的方式让开发者可以在微信中开发具有原生APP体验的服务. 框架提供了自己的视图层描述语言WXML和WXSS, ...
- XML语言1.简介和语法
一.什么是XML语言? XML 指可扩展标记语言(Extensible Markup Language) Xml是独立于软件和硬件的信息传输工具. XML 是一种很像HTML的标记语言. 但xml不是 ...
- C#的几种文件操作方法
创建或覆盖文件 需求:如果文件不存在,创建之,如果存在,覆盖之. 1,可能有问题的方法 using (FileStream fs = File.OpenWrite(@"d:\work\1.t ...
- 【同余方程组】POJ1006 生理周期
同余方程组: 先来看一道题目:有物不知其数,三三数之剩二:五五数之剩三:七七数之剩二.问物几何? 然后我们可以做如下变换,设x为所求的数. x%3=2 x ≡ a1(%m1 ...
- Java面试题:Hibernate的二级缓存与Hibernate多表查询
我们来看两个有关Java框架之Hibernate的面试题,这是关于Hibernate的常考知识点. 1.请介绍一下Hibernate的二级缓存 解题按照以下思路来回答: (1)首先说清楚什么是缓存: ...
- 2种不同方式实现背景图里加入文字的简单CSS样式
如果让你实现下图的样式(图片里面插入文字),你会怎么做呢? 我总结了2种方式 ①:用 img src属性直接引入图片 + 定位 ②:用背景图且不使用定位 第一种: HTML <div class ...