当前位置: 首页 > news >正文

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,就无法保存关联关系了。

参考详细博文:

http://www.cnblogs.com/whgk/p...

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,那么就无法保存关联关系了

如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以 关注微信公众号:Java3y

相关文章:

  • IE安全系列之——昨日黄花:IE中的ActiveX(I)
  • 管道符和作业控制,shell变量和环境变量配置文件
  • Hadoop发行版某厂商发布TPC-DS评测结果
  • node.js中npm安装的模块在哪个目录下
  • AMD和英伟达区块链的闸门已然开启 投资者兴奋不已
  • 大话爬虫的实践技巧
  • 轮播效果
  • python 获取网页内容新增网页分类+删除指定后缀数组元素功能(基于python 3.6)...
  • 我是她的奇迹
  • 解决 Boost安装:fatal error: bzlib.h: No such file or directory 问题
  • 李益:展览工程“绿色供应链”解决之道
  • 当然我在扯淡
  • 另类起床提示 模仿iPod的数字时钟
  • 《2017年人工智能行业发展研究报告白皮书》发布 以数洞见行业未来
  • 【315打假】去信任的区块链技术 难以阻止的失信项目
  • ES6指北【2】—— 箭头函数
  • Android 控件背景颜色处理
  • Android优雅地处理按钮重复点击
  • echarts的各种常用效果展示
  • Java IO学习笔记一
  • Java-详解HashMap
  • Joomla 2.x, 3.x useful code cheatsheet
  • Linux链接文件
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • OSS Web直传 (文件图片)
  • spring学习第二天
  • Vue组件定义
  • 阿里云前端周刊 - 第 26 期
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 王永庆:技术创新改变教育未来
  • 微信公众号开发小记——5.python微信红包
  • 用简单代码看卷积组块发展
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • 湖北分布式智能数据采集方法有哪些?
  • #NOIP 2014#Day.2 T3 解方程
  • (003)SlickEdit Unity的补全
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (笔试题)分解质因式
  • (论文阅读11/100)Fast R-CNN
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (十八)SpringBoot之发送QQ邮件
  • (学习日记)2024.01.19
  • (转)setTimeout 和 setInterval 的区别
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • . NET自动找可写目录
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .Net Core和.Net Standard直观理解
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .Net语言中的StringBuilder:入门到精通
  • /bin/bash^M: bad interpreter: No such file or directory