这篇文章主要介绍了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
到此这篇关于cascade级联关系的文章就介绍到这了,更多相关cascade级联关系内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:cascade级联关系操作案例详解
基础教程推荐
- JDK数组阻塞队列源码深入分析总结 2023-04-18
- Java数据结构之对象比较详解 2023-03-07
- Java实现查找文件和替换文件内容 2023-04-06
- Java文件管理操作的知识点整理 2023-05-19
- springboot自定义starter方法及注解实例 2023-03-31
- Java实现线程插队的示例代码 2022-09-03
- Java并发编程进阶之线程控制篇 2023-03-07
- java基础知识之FileInputStream流的使用 2023-08-11
- ConditionalOnProperty配置swagger不生效问题及解决 2023-01-02
- java实现多人聊天系统 2023-05-19