hibernate mysql cascade_Hibernate第五篇【inverse、cascade属性详解】

前言

上一篇博文已经讲解了一对多和多对一之间的关系了,一对多和多对一存在着关联关系(外键与主键的关系)。本博文主要讲解Inverse属性、cascade属性。这两个属性对关联关系都有影响

Inverse属性

Inverse属性:表示控制权是否转移..

true:控制权已转移【当前一方没有控制权】

false:控制权没有转移【当前一方有控制权】

Inverse属性,是在维护关联关系的时候起作用的。只能在“一”的一方中使用该属性!Inverse属性的默认值为fasle,也就是当前一方是有控制权的

AAffA0nNPuCLAAAAAElFTkSuQmCC

从一下的几个方面看看Inverse在维护关联关系时是否起作用:

保存数据

获取数据

解除关联关系

删除数据对关联关系的影响

保存数据

将inverse属性设置为ture,使dept没有控制权

执行保存数据操作时,发现Hibernate只执行了三条SQL语句。employee表的外键并没有数据

AAffA0nNPuCLAAAAAElFTkSuQmCC

结论:如果设置控制反转,即inverse=true, 然后通过部门方维护关联关系。在保存部门的时候,同时保存员工, 数据会保存,但关联关系不会维护。即外键字段为NULL

查询数据

设置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());

AAffA0nNPuCLAAAAAElFTkSuQmCC

解除关联关系

部门和员工是存在外键的联系的,我们接下来看看inverse属性对于解除关联关系有没有影响

当部门一方有权限时,即inverse属性为false

//查找部门id为1的信息

Dept dept1 = (Dept) session.get(Dept.class, 1);

//清除关联信息

dept1.getSet().clear();

可以解除关联关系,employee的外键字段被设置为NULL了

AAffA0nNPuCLAAAAAElFTkSuQmCC

当部门一方没有权限时,即inverse属性为true

//查找部门id为2的信息

Dept dept1 = (Dept) session.get(Dept.class, 2);

//清除关联信息

dept1.getSet().clear();

不能解除关联关系

AAffA0nNPuCLAAAAAElFTkSuQmCC

删除数据对关联关系的影响

当部门一方有权限时,即inverse属性为false

//查找部门id为2的信息

Dept dept1 = (Dept) session.get(Dept.class, 2);

//删除部门2

session.delete(dept1);

当有控制权的时候可以删除数据,先把外键设置为NULL,再删除数据!

AAffA0nNPuCLAAAAAElFTkSuQmCC

当部门一方没有权限时,即inverse属性为true

//查找部门id为1的信息

Dept dept1 = (Dept) session.get(Dept.class, 1);

//删除部门1

session.delete(dept1);

直接抛出异常,说该部门拥有外键,不能删除数据!

AAffA0nNPuCLAAAAAElFTkSuQmCC

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);

AAffA0nNPuCLAAAAAElFTkSuQmCC

如果我们在dept中设置了级联保存,那么Hibernate就会知道:保存dept的数据时,发现dept了外键,也把dept外键的对象保存在数据库之中

AAffA0nNPuCLAAAAAElFTkSuQmCC

级联删除

级联删除,这个对于我们来说风险太大了,如果删除了某些数据,会把另外有关联的数据也删除...在实际中我们一般不使用!

在没有设置级联删除的时候,我们试试删除dept

//删除部门为3的记录

Dept dept1 = (Dept) session.get(dept.getClass(), 3);

session.delete(dept1);

它会先把3的外键对应的记录删除,再删除部门的数据

AAffA0nNPuCLAAAAAElFTkSuQmCC

在设置级联删除的时候,我们试试删除dept

级联删除数据

//删除部门为4的记录

Dept dept1 = (Dept) session.get(dept.getClass(), 4);

session.delete(dept1);

我们发现数据相关联的数据都没有了

AAffA0nNPuCLAAAAAElFTkSuQmCC

cascade和inverse同时使用

上面我们已经把cascade和inverse都介绍一遍了,那么cascade和inverse同时使用会怎么样呢???我们来测试一下

设置dept没有控制权,但设置级联保存、删除

添加一个dept对象

//添加一个dept对象

session.save(dept);

如果我们单单设置了inverse属性为true,那么数据库中肯定是不能维护关联关系的【这里我们已经测试了】

但是呢,现在也设置了级联保存,级联保存是否可以让该对象相关的关联关系一并保存在数据库中的。

我们来看看结果:

AAffA0nNPuCLAAAAAElFTkSuQmCC

inverse的优先级是比cascade的优先级要高的,因此设置了inverse属性为true,那么cascade就无效了。

参考详细博文:

总结

上面的测试都是通过几个方面的,看起来有点多,因此我们总结一下

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要高的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555547.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java请编写公共类继承抽象类_(Java相关)怎么理解抽象类,继承和接口?

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。作者:海子来源:博客园一.抽象类在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽…

Maven:repositories、distributionManagement、pluginRepositories中repository的区别

一、repositories中的repository二、distributionManagement中的repository三、pluginRepositories中的repository 一、repositories中的repository 表示从什么库地址可以下载项目依赖的库文件&#xff0c;比如&#xff1a; <repositories><repository><id>…

maven配置之:<distributionManagement>snapshot快照库和release发布库

在使用maven过程中&#xff0c;我们在开发阶段经常性的会有很多公共库处于不稳定状态&#xff0c;随时需要修改并发布&#xff0c;可能一天就要发布一次&#xff0c;遇到bug时&#xff0c;甚至一天要发布N次。 我们知道&#xff0c;maven的依赖管理是基于版本管理的&#xff0c…

maven-compiler-plugin 插件详解

作用&#xff1a;指定maven编译的jdk版本和字符集,如果不指定,maven3默认用jdk 1.5 maven2默认用jdk1.3 <plugin> <!-- 指…

面试常见java异常题_Java异常面试题(含答案)

1、Java中异常分为哪两种&#xff1f;编译时异常运行时异常2、异常的处理机制有几种&#xff1f;异常捕捉&#xff1a;try…catch…finally&#xff0c;异常抛出&#xff1a;throws。3、如何自定义一个异常继承一个异常类&#xff0c;通常是RumtimeException或者Exception4、tr…

maven打包插件:maven-compiler-plugin、maven-dependency-plugin、maven-jar-plugin、maven-resources-plugin详解

最近开发的产品&#xff0c;我们是有四五个maven模块&#xff0c;开发阶段一直是在eclipse中运行的&#xff0c;然后快发版的时候&#xff0c;需要把这些项目打成jar包&#xff0c;通过命令去启动&#xff0c;那首先就得把这些模块项目打包&#xff0c;或者拷贝一些资源文件等等…

Java Web访问.action_java设置web首页访问action

index.jsp一般首页进的是静态页面如果需要首页是动态的页面 就需要先进action访问数据 再回到首页显示因为 welcome-file 必须是实际存在的文件&#xff0c;不能是action或者servlet路径如果直接把index.jsp改成action 会出现404index.action直接设置action&#xff0c;404和s…

spring boot中打包插件spring-boot-maven-plugin和maven-jar-plugin的关联

简介 用spring boot快速开发时&#xff0c;通常用spring-boot-maven-plugin插件将springboot的应用程序打包成jar文件&#xff0c;然后通过java -jar运行&#xff0c;很方便。但是如果是部署到服务器上&#xff0c;每次更改代码后替换的包都比较大&#xff0c;至少30MB以上&am…

简化java_JAVA之旅-简化java开发

为了降低java开发的复杂性&#xff0c;spring采取了以下4种关键策略基于POJO的轻量级和最小侵入行编程为使不让应用与框架绑死&#xff0c;一个bean不会实现&#xff0c;继承或者导入Spring API相关的任何东西&#xff0c;只是一个普通的java对象。2. 通过依赖注入和面相接口实…

Maven父子结构的项目依赖使用以及打包依赖_微服务项目(maven父子级项目)怎么打包

Maven父子结构的项目依赖使用以及打包依赖 1&#xff1a;在父子结构项目中&#xff0c;如果要是用其他模块的类。在当前项目中的pom中 加入 其他模块的配置 <dependency><groupId>com.spring.mySpring</groupId><artifactId>mySpring-utils</artif…

搭建一个完整的微服务项目

一.项目技术架构 1.技术栈 前台技术 Node.js、Npm、Vue.js、WebPack、Vue Cli、Element UI 后台架构 微服务架构&#xff1a;按照功能拆分N多个服务&#xff0c;每个服务可以独立技术选型,独立开发,独立部署,独立运维.&#xff0c;单个服务使用基于ssm的springboot&#xff0…

java 雅思_基于JAVA的雅思考试管理系统的设计与实现(SSH,MySQL)(含录像)

基于JAVA的雅思考试管理系统的设计与实现(SSH,MySQL)(含录像)(任务书,毕业论文12000字,程序代码,MySQL数据库)本文分析了基于JAVA的雅思考试管理系统的设计与实现技术&#xff0c;结合实际提出了本系统的总体结构设计和主要模块的功能实现。本系统分为二个子系统:管理员子系统&…

java开发利器 源码_Java开发的利器: 反编译工具 JD-GUI

老赵说起来也能算个Java程序员&#xff0c;可是写过的Java代码并不多&#xff0c;可老赵实实在在是从程序员干起的。虽然肚子里也装了不少的东西&#xff0c;可作为一件乐此不疲的事情&#xff0c;就是看那些所谓“高人”的代码。高人们的行事风格&#xff0c;十人十样&#xf…

Maven搭建Nexus私服

私服的介绍 1 什么是私服 私服是一种特殊的远程仓库&#xff0c;它是架设在局域网的仓库服务&#xff0c;私服代理广域网上的远程仓库&#xff0c;供局域网使用。 在企业开发中&#xff0c;私服的建设是有必要的&#xff0c;其好处如下&#xff1a; 1.1 节省资金、外网带宽…

java类加载面试题_java 类加载过程?【面试题详解】

今天爱分享给大家带来java 类加载过程?【面试题详解】&#xff0c;希望能够帮助到大家。java 类加载需要经历一下 7 个过程:加载加载时类加载的第一个过程&#xff0c;在这个阶段&#xff0c;将完成一下三件事情: 1. 通过一个类的全限定名获取该类的二进制流。2. 将该二进制流…

Java中Calendar类的常用方法

Calendar类常用方法的记录&#xff1a; 获取时间 // 使用默认时区和语言环境获得一个日历Calendar cal Calendar.getInstance();// 赋值时年月日时分秒常用的6个值&#xff0c;注意月份下标从0开始&#xff0c;所以取月份要1System.out.println("年:" cal.get(Cal…

Java啤酒生产系统描述_Java描述设计模式(03):工厂方法模式

一、工厂方法模式1、生活场景系统常见的数据导出功能&#xff1a;数据导出PDF、WORD等常见格式。2、工厂方法模式是类的创建模式&#xff0c;又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。工厂方法模式的用意是定义一个创建产品对象的工…

@Autowired(required=false)注入注意的问题

1、前言 在使用spring开发过程中&#xff0c;我们基本上都是使用Autowired这个注解&#xff0c;用来注入已有的bean。但是有些时候&#xff0c;会注入失败。当我们加上参数&#xff08;requiredfalse&#xff09;就能解决。今天整理一个我在实际开发中的例子 2、required属性…

jna enum 对应 java_JNA简单使用

近期使用Java开发有关于摄像机接收到数据的上传&#xff0c;因为摄像机处理图像是用C语言实现的&#xff0c;所以开发需要用到JNA&#xff0c;实现JAVA对C语言的回调,因为具体的开发方式官方文档里面有示例&#xff0c;所以本文只是简单的把需要注意的点罗列出来。一、 定义JNA…

java if经典程序_java经典程序(11-20)

package question;import java.util.Scanner;public class Test11_20 {/** 输入一个数据n&#xff0c;计算斐波那契数列的第n个值 并打印所以值* 1 1 2 3 5 8 13* 规律一个数等于前两个数之和*/public void test11(){Scanner sc new Scanner(System.in);int n sc.nextInt();i…