cascade级联关系操作实例分析

发布时间:2022-07-19 17:26:09 作者:iii
来源:亿速云 阅读:369

今天小编给大家分享一下cascade级联关系操作实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

属性

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级联关系操作实例分析”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注亿速云行业资讯频道。

推荐阅读:
  1. cascade与inverse (hibernate)
  2. Django 模型类关系及相关操作

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

cascade

上一篇:网站怎么通过nginx设置黑/白名单IP限制及国家城市IP访问限制

下一篇:微信小程序如何实现select二级下拉

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》