cascade级联关系操作案例详解

作者:过期可乐 时间:2022-04-11 08:11:09 

属性

  • 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

标签:cascade,级联,关系
0
投稿

猜你喜欢

  • 深入剖析Java工厂模式让你的代码更灵活

    2022-05-26 00:42:28
  • Android 如何获取手机总内存和可用内存等信息

    2023-07-27 13:11:42
  • SpringBoot加载外部依赖过程解析

    2021-11-23 22:30:00
  • Java利用Selenium操作浏览器的示例详解

    2022-06-17 17:34:20
  • java 交换两个数据的方法实例详解

    2021-12-06 00:56:04
  • JavaSE实现猜拳游戏

    2023-12-22 07:21:19
  • C# WebApi 接口返回值不困惑:返回值类型详解

    2022-05-06 13:16:35
  • SpringBoot项目Jar包如何瘦身部署的实现

    2021-09-21 05:37:51
  • 详解在Java的Struts2框架中配置Action的方法

    2023-08-01 11:01:40
  • java图片缩放实现图片填充整个屏幕

    2021-06-09 18:30:07
  • C#中抽象方法与虚拟方法的区别

    2021-10-30 07:30:15
  • .NET垃圾回收器(GC)原理浅析

    2023-11-24 13:50:56
  • SpringBoot实现单文件与多文件上传功能

    2023-03-22 23:44:11
  • B/S与C/S架构的区别介绍

    2023-07-02 13:24:33
  • c#连接mdf文件示例分享

    2022-12-15 10:48:33
  • android使用OkHttp实现下载的进度监听和断点续传

    2022-03-23 12:37:07
  • Java权重随机的实现方法

    2021-10-05 14:27:50
  • jdk自带线程池实例详解

    2022-05-14 02:04:56
  • C#中数组、ArrayList、List、Dictionary的用法与区别浅析(存取数据)

    2021-05-27 03:55:49
  • C++语言实现线性表之链表实例

    2023-06-20 22:21:20
  • asp之家 软件编程 m.aspxhome.com