Hibernate的级联保存、级联删除
级联操作:
属性:cascade
值:save-update(级联保存)
delete(级联删除)
all(级联保存+级联删除)
优点:虽然,不用级联操作也能解决问题。但是级联操作可以减少代码量,使得操作变得更加简洁。
一、一对多
以下演示为操作一的一方(班级),同时实现对班级下的学生的增加删除操作,配置文件的修改是在一的一方(班级):
1、级联保存:
(1)不使用级联保存:
一般情况下向一个不存在的班级中添加学生,在设置了班级与学生的一对多、多对一关系后,需要调用save方法对班级和学生进行保存,如果有很多个学生会比较麻烦。
一对多配置:
<set name="students" table="student" ><!--一对多关系配置-->
<key column="classno" update="false"></key><!--指定了集合表的外键-->
<one-to-many class="Student"></one-to-many>
</set>
public static void testadd1() {
Session session = HibernateUtils.openSession();//获得session
Transaction transaction = session.beginTransaction();//开启事务
Clas clas=new Clas();
clas.setClassname("计科171");
clas.setClassno(4600);
clas.setDepartment("一号楼");
clas.setMonitor("zhai");
Student student=new Student();
student.setSname("翟");
student.setStudentno(2017151411);
student.setPoint(123f);
student.setSex("男");
student.setBirthday("2019-11-11");
student.setPhone("18739496522");
student.setClassno("221221");
student.setEmail("34288334@qq.com");
Student student1=new Student();
student1.setSname("翟hb");
student1.setStudentno(2017151419);
student1.setPoint(666f);
student1.setSex("女");
student1.setBirthday("2019-11-11");
student1.setPhone("18739496522");
student1.setClassno("221221");
student1.setEmail("34288334@qq.com");
clas.getStudents().add(student);//一对多,一个班级下有多个学生
clas.getStudents().add(student1);//获取Set集合对象并向其中添加元素
student.setaClas(clas);//多对一,学生属于哪一个班级
student1.setaClas(clas);
session.save(clas);
session.save(student);
session.save(student1);//需要执行save方法对学生和班级进行保存
transaction.commit();//提交事务
session.close();//关闭资源
}
(2)使用级联保存:
配置文件(需要添加cascade属性):
<set name="students" cascade="save-update"><!--一对多关系配置-->
<key column="classno" update="false"></key><!--指定了集合表的外键-->
<one-to-many class="Student"></one-to-many>
</set>
public static void testadd1() {
Session session = HibernateUtils.openSession();//获得session
Transaction transaction = session.beginTransaction();//开启事务
Clas clas=new Clas();
clas.setClassname("计科171");
clas.setClassno(46);
clas.setDepartment("一号楼");
clas.setMonitor("zhai");
Student student=new Student();
student.setSname("翟");
student.setStudentno(210);
student.setPoint(123f);
student.setSex("男");
student.setBirthday("2019-11-11");
student.setPhone("18739496522");
student.setEmail("34288334@qq.com");
Student student1=new Student();
student1.setSname("翟hb");
student1.setStudentno(112);
student1.setPoint(666f);
student1.setSex("女");
student1.setBirthday("2019-11-11");
student1.setPhone("18739496522");
student1.setEmail("34288334@qq.com");
clas.getStudents().add(student);//一对多,一个班级下有多个学生
clas.getStudents().add(student1);//获取Set集合对象并向其中添加元素
session.save(clas);
transaction.commit();//提交事务
session.close();//关闭资源
}
在保存的时候只需要保存一的一方,减少了代码量。
2、级联删除:
(1)普通方法:
配置文件:
<set name="students"><!--一对多关系配置-->
<key column="classno" update="false"></key><!--指定了集合表的外键-->
<one-to-many class="Student"></one-to-many>
</set>
public static void testDel() {
Session session = HibernateUtils.openSession();//获得session
Transaction transaction = session.beginTransaction();//开启事务
Clas clas=session.get(Clas.class,90865);//获得要删除的学生属于那一个班级
Student student1=session.get(Student.class,937221539);//获得要删除的学生
Student student2=session.get(Student.class,937221540);//获得要删除的学生
clas.getStudents().remove(student1);
clas.getStudents().remove(student2);
student1.setaClas(null);
student2.setaClas(null);
session.remove(clas);
transaction.commit();//提交事务
session.close();//关闭资源
}
对一个班级和班级下的两名学生进行删除操作,需要先对学生进行删除,然后删除学生所在的班级,如果学生数量比较多,那么操作起来是相当麻烦的。
(2)级联删除:
先对配置文件添加cascade属性:
<set name="students" cascade="delete"><!--一对多关系配置-->
<key column="classno" update="false"></key><!--指定了集合表的外键-->
<one-to-many class="Student"></one-to-many>
</set>
public static void testDel() {
Session session = HibernateUtils.openSession();//获得session
Transaction transaction = session.beginTransaction();//开启事务
Clas clas=session.get(Clas.class,);//获得要删除的学生属于那一个班级
session.delete(clas);
transaction.commit();//提交事务
session.close();//关闭资源
}
在进行删除操作的时候,只需要删除一的一方(班级),多的一方(学生),也会被删除。即,在对某一个班级进行删除的时候,班级下的所有学生一起也被删除了,减少了代码量,尤其是在学生数量较多的情况下优点更为明显。
二、多对一:
1、级联保存:
(1)在多的一方(学生)对配置文件增加cascade属性:
<many-to-one cascade="save-update" name="aClas" column="classno" class="Clas"></many-to-one>
(2)在增加学生的同时,会把学生所在的班级一同进行添加:
public static void testadd1() {
Session session = HibernateUtils.openSession();//获得session
Transaction transaction = session.beginTransaction();//开启事务
Clas clas=new Clas();
clas.setClassname("计科171");
clas.setClassno(46);
clas.setDepartment("一号楼");
clas.setMonitor("zhai");
Student student=new Student();
student.setSname("翟");
student.setStudentno(210);
student.setPoint(123f);
student.setSex("男");
student.setBirthday("2019-11-11");
student.setPhone("18739496522");
student.setEmail("34288334@qq.com");
clas.getStudents().add(student);//获取Set集合对象并向其中添加元素
student.setaClas(clas);
session.save(student);
transaction.commit();//提交事务
session.close();//关闭资源
}
Hibernate的级联保存、级联删除的更多相关文章
- hibernate 一对多 级联 保存修改 删除
一对多,一端设置: <set name="TWorkorderHistories" inverse="true" cascade="all&qu ...
- 【JPA 级联保存/级联删除】@OneToMany (双向) 一对多【转】
[http://blog.sina.com.cn/s/blog_625d79410101dbdd.html] 看过前两篇帮助文档 [JPA] @OneToOne 单向 和 [JPA]@OneToO ...
- (原创)Hibernate 使用过程中(尤其是多对多关联中的级联保存和级联删除)的注意事项(基于项目的总结)
一.先上知识点: 1.hibernate多对多关联关系中最重要的参数是(基于配置文件xxx.hbm.xml文件形式): 1):inverse属性,如果设置inverse=“true”就代表让对方参与维 ...
- Hibernate中表与表之间的关联多对多,级联保存,级联删除
第一步:创建两个实体类:用户和角色实体类,多对多关系,并让两个实体类之间互相关联: 用户实体类: package com.yinfu.entity; import java.util.HashSet; ...
- Hibernate中表与表之间的关联一对多,级联保存和级联删除
1:Hibernate的一对多操作(重点) 一对多映射配置 第一步:创建两个实体类:客户和联系人(例)以客户为一,联系人为多: package com.yinfu.entity; public cla ...
- 再谈Hibernate级联删除——JPA下的Hibernate实现一对多级联删除CascadeType.DELETE_ORPHAN
声明: 1.本文系原创,非抄袭或转载过来的. 2.本文论点都亲手做过实验论证. 3.本文所讲的Hibernate配置都基于注解的方式,hbm语法未提供. 非常多人对持久层概念搞不清JPA.Hibern ...
- Hibernate入门(八)级联保存或更新(含问题在末尾,求大佬指点..)
级联保存或更新CASCADE 级联保存或更新: 作用就是:保存一方的数据的时候,会把关联的对象也同时保存. 级联保存或更新的配置: 属性名:cascade 属性值: 1.none:所有情况下均不进行关 ...
- Java三大框架之——Hibernate关联映射与级联操作
什么是Hibernate中的关联映射? 简单来说Hibernate是ORM映射的持久层框架,全称是(Object Relational Mapping),即对象关系映射. 它将数据库中的表映射成对应的 ...
- 六 Hibernate多表操作&级联&外键维护
Hibernate的一对多关联映射 Hibernate的多对多关联映射 数据库表与表之间的关系:一对多,多对多,一对一 一对多:一个部门对应多个员工,一个员工只能属于一个部门.一个客户对应多个联系人, ...
随机推荐
- golang学习笔记--包导入及go 常用命令及参数
包导入:包导入路劲即代码包在工作区的src目录下的相对路径. 同一个源码文件中导入的多个代码包的最后一个元素不能重复,否则引起编译错误,如果只导入不使用,同样会引起编译错误 若想导入最后一个元素名相同 ...
- 思维导图xmind的文档保存问题
如果文件名相同,可能最新的文档覆盖以前的.当前活动文档只能有一个,如果有多个,保存后,其他活动文档也被更新了. 新建一个空白doc文档,仅仅是文件名,作为附件导入到xmind中,在xmind中保存后, ...
- Vertx的命令行
IntelliJ----创建一个运行配置(Application), 用io.vertx.core.Launcher类作为主类,在程序参数输入:run your-verticle-fully-qual ...
- 《JavaEE开发的颠覆者——Spring Boot实战》是一本好书
这本书的风格非常好.每一节都是先点明这一块知识的要点,随后就手把手的做出一个最简明.但有能体现核心的实例(大多只有几个Class) 这样的书用来熟悉一门框架,实在是再好不过.
- 解决v-html无法理解vue模版的问题-动态获取模版,动态插入app并使用当下app状态数据需求
很多情况下,我们需要使用动态的html作为某个dom元素的inner html,如果这个内容是标准的html的话,则v-html能够圆满满足需求,而如果内容包含了vue组件,则使用v-html就不能达 ...
- React生命周期中应该做什么事
React生命周期函数 装载组件触发 0.construct(props) 用来 props--->state 初始化state,并且把props转化为state 1.componentWill ...
- 前端1-----HTML了解,内联标签(图片,超链接锚点,超链接邮箱)
前端1-----HTML了解,内联标签(图片,超链接锚点,超链接邮箱) 一丶自定制B/S # -*-coding:utf-8-*- # Author:Ds import socket IP_PORT= ...
- 剑指前端(前端入门笔记系列)——DOM(基本组成与操作)
DOM——基本组成与操作 DOM是针对HTML和XML文档的一个API(应用程序编程接口).DOM描绘了一个层次化的节点树,允许开发人员添加.移除和修改页面的某一部分.他给文档提供了一种结构化的表达方 ...
- Java深入学习(3):线程池原理
线程池的特点: 降低资源:通过重复利用已创建的线程降低线程创建和销毁的损耗 提高效率:当任务到底时,不需要等待,立即执行 方便管理:统一分配,调优和监控等 线程池的创建方式: 1.CachedThre ...
- echarts 通过源码方法 传入对应data数据获取分割步长值
通过源码方法获取这里的分割数字长度 /** * Quantity of a number. e.g. 0.1, 1, 10, 100 * * @param {number} val * @return ...