前言

上一篇博文已经讲解了一对多和多对一之间的关系了,一对多和多对一存在着关联关系(外键与主键的关系)。本博文主要讲解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是相互独立的。cascade是不能影响着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同时设置时:

  • cascade和inverse是相互独立的,cascade不能影响着inverse

Hibernate第五篇【inverse、cascade属性详解】的更多相关文章

  1. 第五篇Django URL name 详解

    Django URL name 详解 利用Django开发网站,可以设计出非常优美的url规则,如果url的匹配规则(包含正则表达式)组织得比较好,view的结构就会比较清晰,比较容易维护. Djan ...

  2. Vue.js 源码分析(五) 基础篇 方法 methods属性详解

    methods中定义了Vue实例的方法,官网是这样介绍的: 例如:: <!DOCTYPE html> <html lang="en"> <head&g ...

  3. Vue.js 源码分析(十三) 基础篇 组件 props属性详解

    父组件通过props属性向子组件传递数据,定义组件的时候可以定义一个props属性,值可以是一个字符串数组或一个对象. 例如: <!DOCTYPE html> <html lang= ...

  4. Vue.js 源码分析(十一) 基础篇 过滤器 filters属性详解

    Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化.过滤器可以用在两个地方:双花括号插值和 v-bind 表达式 (后者从 2.1.0+ 开始支持).过滤器应该被添加在 JavaScrip ...

  5. OutputCache属性详解(四)— SqlDependency

    目录 OutputCache概念学习 OutputCache属性详解(一) OutputCache属性详解(二) OutputCache属性详解(三) OutputCache属性详解(四)— SqlD ...

  6. 轻松学习Linux之Shell文件和目录属性详解

    轻松学习Linux之Shell文件和目录属性详解 轻松学习Linux之理解Sitcky 轻松学习Linux之理解umask 轻松学习Linux之理解SUID&SGUID 本系列多媒体教程已完成 ...

  7. android:exported 属性详解

    属性详解 标签: android 2015-06-11 17:47 27940人阅读 评论(7) 收藏 举报 分类: Android(95) 项目点滴(25) 昨天在用360扫描应用漏洞时,扫描结果, ...

  8. Android中的windowSoftInputMode属性详解

    这篇文章主要介绍了Android中的windowSoftInputMode属性详解,本文对windowSoftInputMode的9个属性做了详细总结,需要的朋友可以参考下     在前面的一篇文章中 ...

  9. [转]CSS vertical-align属性详解 作者:黄映焜

      CSS vertical-align属性详解 posted @ 2014-08-26 17:44 黄映焜   前言:关于vertical-align属性. 实践出真知. 垂直居中. 第二种用法. ...

随机推荐

  1. 【SQL*PLUS】常规使用

    登陆SQL*PLUS sqlplus sys/Manager123 as sysdba 创建数据库实例并挂载数据库,此时加载数据库文件,但数据表不能访问. SQL>startup mount; ...

  2. Oracle 与Mysql区别

    1.组函数用法规则 mysql中组函数在select语句中可以随意使用,但在oracle中如果查询语句中有组函数,那其他列名必须是组函数处理过的,或者是group by子句中的列否则报错 eg: se ...

  3. 如何编写更好的SQL查询:终极指南-第二部分

    上一篇文章中,我们学习了 SQL 查询是如何执行的以及在编写 SQL 查询语句时需要注意的地方. 下面,我进一步学习查询方法以及查询优化. 基于集合和程序的方法进行查询 反向模型中隐含的事实是,建立查 ...

  4. MySQL整数类型说明 int(5) vs int(7)

    今天突然发现, mysql 中int(1)和tinyint(1)中的1只是指定显示长度,并不表示存储长度,只有字段指定zerofill时有用.位数限制基本没有意义. int(5) 这里的5表示的是 最 ...

  5. XMind与MindManager哪个好(网易云课堂老师:Array老师讲解稿)

    XMind与MindManager哪个好 作者:网易云课堂老师:Array老师讲解稿 思维导图是一种将放射性思考具体化的方法,可以将人们的创造性思维及时捕捉并呈现,深受商业人士的喜爱.目前,XMind ...

  6. 学生管理系统开发代码分析笔记:jsp+java bean+servlet技术

    1 序言 学习java web的时候很渴望有一份完整的项目给我阅读,而网上的大部分项目拿过来都无法直接用,好不容易找到了一个学生管理系统也是漏洞百出.在此,我将边修改边学习这份代码,并且加上完全的注释 ...

  7. 工具类:关于解决数据库中的日期格式,经过response.getWriter().write(json)打到前台日期格式混乱的问题的总结

    经过response.getWriter().write(json)打到前台日期格式混乱的问题的总结 import java.text.SimpleDateFormat;import net.sf.j ...

  8. chrome开发工具指南(一)

    注意:如果你是一个网页开发者同时想要获得最新版本的开发工具,那么你应该使用谷歌浏览器(金丝雀)Canary 版. Chrome 开发者工具 打开Chrome 开发者工具 选择浏览器位于浏览器窗口右上方 ...

  9. java并发之原子性

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp17 1.原子性操作: 不能被线程调度机制中断的操作:--对原子性变量的赋值 ...

  10. POJ 1236 tarjan

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19613   Accepted: 77 ...