cascade级联关系操作案例详解
作者:过期可乐 发布时间:2022-04-11 08:11:09
标签:cascade,级联,关系
属性
CascadeType.REFRESH
:级联刷新,当多个用户同时作操作一个实体,为了用户取到的数据是实时的,在用实体中的数据之前就可以调用一下refresh()方法CascadeType.REMOVE
:级联删除,当调用remove()方法删除Order实体时会先级联删除OrderItem的相关数据CascadeType.MERGE
:级联更新,当调用了Merge()方法,如果Order中的数据改变了会相应的更新OrderItem中的数据CascadeType.PERSIST
:级联保存,当调用了Persist() 方法,会级联保存相应的数据CascadeType.DETACH
:级联脱管/游离操作,如果你要删除一个实体,但是它有外键无法删除,你就需要这个级联权限了。它会撤销所有相关的外键关联。
CascadeType.ALL
:包含以上所有级联属性
级联保存,级联修改,级联删除案例
//学校类
@Table(name = "t_school")
@Entity
@Getter
@Setter
public class School extends BaseEntity {
private String name;
@JsonIgnore
@OneToMany(mappedBy = "school", cascade = {CascadeType.REFRESH, CascadeType.REMOVE, CascadeType.PERSIST}, fetch = FetchType.LAZY)
private List<Student> students = new ArrayList<>();
//手动构造添加学生的方法
public void addStudent(Student stu){
if(!students.contains(stu)){
stu.setSchool(this); //设置学校
this.students.add(stu); //添加
}
}
//重写equals和hashCode方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
School school = (School) o;
return Objects.equals(name, school.name) &&
Objects.equals(students, school.students);
}
@Override
public int hashCode() {
return Objects.hash(name, students);
}
}
//学生类
@Table(name = "t_student")
@Entity
@Getter
@Setter
public class Student extends BaseEntity {
private String name;
private String age;
@ManyToOne(cascade = CascadeType.REFRESH,optional = false)
@JoinColumn(name = "SCHOOL_ID")
private School school;
}
//测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class SchoolDaoTest {
@Autowired
private SchoolDao schoolDao;
@PersistenceContext
private EntityManager em;
@Test
public void testSave() {
School school = new School();
school.setName("学校1");
Student student1 = new Student();
student1.setAge("18");
student1.setName("张三");
Student student2 = new Student();
student2.setAge("18");
student2.setName("李四");
school.addStudent(student1);
school.addStudent(student2);
//经过测试,用save方法也是可以的
schoolDao.saveAndFlush(school); //这个方法dao类需要去继承JpaRepository
}
@Test
public void testDel() {
schoolDao.deleteById(1365157538168864L);
}
/**
* 级联更新
*/
@Test
public void testMerge(){
Optional<School> rs = schoolDao.findById(1365164498616352L);
School school = rs.isPresent()? rs.get() : null;
if(school != null){
school.setName("学校2");
List<Student> students = school.getStudents();
if(students != null && students.size() > 0){
for (Student student : students) {
student.setName("改名字");
}
}
school.setStudents(students);
schoolDao.save(school);
}
}
}
经过测试,在保存school的时候会一起把student一起保存,级联保存 删除学校会把级联的student一起删除
级联更新
`cascade`属性加上`CascadeType.MERGE`,注意:不能和懒加载一起使用,正确加载方式:fetch = FetchType.EAGER
来源:https://www.cnblogs.com/liweixml/p/13518645.html


猜你喜欢
- 使用Java语言编写一个模拟网上超市购物结算功能的程序,要求程序运行后有一个图形用户界面,可供用户输入购买的各种商品相关信息,最后给出用户的
- 前言列表在我们的日常开发中使用的频率是非常高的,像下图的歌曲播放列表,或者课程展示,那么这些场景都需要我们用到点击事件,点击歌曲播放歌曲,点
- SSM(Spring+SpringMVC+Mybatis),目前较为主流的企业级架构方案。标准的MVC设计模式,将整个系统划分为显示层、Co
- Mybatis 入参方式单个基本类型或 String 参数在 mapper 文件中随便写<select id=""
- Java微信跳一跳操作指南,指哪挑哪。本文的思路是通过adb来控制手机进行操作,通过java写一个jframe覆盖在手机屏幕上,用鼠标获取跳
- 在线用户使用HttpSessionListener * 统计 每当一个session会话建立 在线用户人数+1每当一
- SimpleDateFormat是处理日期格式转换的类。官方API_1.8关于SimpleDateFormat继承于DateFormate截
- 这篇文档主要关注下配置修改后对应的 Java 对象是如何更新,并不关注整体的配置改动流程所有代码都来自 apollo-client 项目更新
- 01.点明观点 C#中,非托管资源使用之后必须释放,而using()是使用非托管资源的最佳方式,可以确保资源在代码块结束之后被正确
- 引言最新有一个winform项目使用的是DevExpress的控件,所以最近都在摸索使用这套控件,实在是佩服整套控件的强大,同时代码写起来也
- 本文实例为大家分享了C#实现简易计算器功能的具体代码,供大家参考,具体内容如下实现页面布局和数值初始化using System;using
- 一、概述当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等。一般情况下,我们知道View类有个View
- int a = 5; int b = 30; Console.WriteLine(a^b);&n
- Java中Stop-The-World机制简称STW,是在执行垃圾收集算法时,Java应用程序的其他所有线程都被挂起(除了垃圾收集帮助器之外
- Knn算法的核心思想是如果一个样本在特征空间中的K个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性
- java抠图片文字或签名运行原理第一步 遍历像素点BufferedImage image = ImageIO.read(new File(i
- 1.介绍有时候我们在Linux中运行Java程序时,需要调用一些Shell命令和脚本。而Runtime.getRuntime().exec(
- 亲爱的读者,在这篇文章中,我提供了一些c#编程的最佳实践。你是否在用户输入验证中使用异常处理机制?如果是,那么你就是那个把你的项目执行速度降
- /** * 循环录像,当内存卡容量少于300M时,自动删除视频列表里面的第一个文件 */private void xunhuanluxian
- 本文实例讲述了C#验证给定字符串形式日期是否合法的方法。分享给大家供大家参考。具体分析如下:这段C#代码用于验证日期的有效性,对于用户输入的