Hibernate(9) 多对多的级联操作

版权声明:转载需经同意,谢谢! https://blog.csdn.net/Big_KK/article/details/82054555

多对多的级联操作

在建立完多对多的映射关系之后,可以尝试对其进行级联操作

1.多对多的级联插入操作

新建实体对象,可以将两者的任意一方加入到本实体中,因为是多对对,学生可以对应更多的老师表示有更多的老师教他,老师也可以添加学生以表示老师教授了更多的学生。

按照上篇的举例继续演示示例,添加两位老师,以及3名学生,李老师教学生1,2、 许老师教学生1,2,3。示例代码如下:

@Test
    public void test_manyTomany(){
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction transaction = null;
        try{
            sessionFactory = HibernateUtils.getSessionFactory();
            session = sessionFactory.getCurrentSession();
            transaction = session.getTransaction();
            transaction.begin();

            Student student1 = new Student();
            student1.setName("小明");
            Student student2 = new Student();
            student2.setName("小白");
            Student student3 = new Student();
            student2.setName("小张");

            Teacher teacher1 = new Teacher();
            teacher1.setName("李老师");
            teacher1.getStudentSet().add(student1);//将小明加入到李老师教授的学生列表
            teacher1.getStudentSet().add(student2);//将小白加入到李老师教授的学生列表

            Teacher teacher2 = new Teacher();
            teacher2.setName("许老师");
            teacher2.getStudentSet().add(student1);//同上
            teacher2.getStudentSet().add(student2);
            teacher2.getStudentSet().add(student3);

            //仅持久化老师实体,因为在set标签设置了cascade="save-update",所以相关的学生实体也会持久化
            session.save(teacher1);
            session.save(teacher2);

            transaction.commit();
        }catch (Exception e){
            transaction.rollback();
        }finally {
            if(sessionFactory!=null){
                sessionFactory.close();
            }
        }
    }

提交之后,到数据库从查看结果,建立了所希望的映射关系:
存储老师的表与存储学生的表两者并没有直接的关系,而是依靠第三张表来进行维护的
这里写图片描述


2.多对多级联删除操作

类似的,也需要在set标签设置cascade=”delete”,对于多对多级联插入,需要设置cascade=”save-update”,可以使用逗号同时设置两个值。

             //获取待删除的老师
            Teacher teacherA = (Teacher) session.get(Teacher.class,1);
            session.delete(teacherA);

主要是以上两方代码,将获取到的A老师作为参数传递给delete,那么也在删除A老师这个对象的同时,也会删除和A老师这个对象有关的学生,删除学生是在第三张维护关系的表里面删除与A老师有关的学生的id以消除该学生与A老师的联系,仅删除关系表里面的关系
上面代码的删除结果:
这里写图片描述
可以看到,虽然李老师被删除,但是因为他教的学生许老师也都在教,所以仅仅只是移除李老师以及其关系表里面学生与他的关系,而学生还是存在的。


3.维护第三张表(关系表)

在本例中,可以通过修改第三张表的方式来指定学生由哪个老师教授,那个学生不再由老师教授等操作,因为这个表就是存储关系的,更改这个表也就是在更改关系,联系本例,可以对第三张表进行以下操作:

  1. 让某个老师教授一名学生(将表A与表B建立关系)
    过程:通过id查询到老师,学生这两个对象。然后将这个学生直接放到老师这个对象的studentSet集合里面去,后续由于Hibernate会自动更新持久态实体,所以就建立了关系,不用主动save()/update()
            //获取待建立关系的老师
            Teacher teacher = (Teacher) session.get(Teacher.class,1);

            Student student = (Student) session.get(Student.class, 4);

            teacher.getStudentSet().add(student);

            //这样,老师teacher就与student建立了教课关系

   2.让老师不再教授某个学生(将A与表B解除联系)
过程:通过id查询到学生以及老师这两个对象,然后从老师的studentSet集合里面将这个学生去除就行,去除后studentSet集合发生了改变,又因为Hibernate会自动更新持久态实体,所以就解除了关系,不用主动save()/update()

            //获取解除关系的老师
            Teacher teacher = (Teacher) session.get(Teacher.class,2);
            //获取学生
            Student student = (Student) session.get(Student.class, 2);
            //将该学生从集合移除
            teacher.getStudentSet().remove(student);
            //这样就解除了关系

猜你喜欢

转载自blog.csdn.net/Big_KK/article/details/82054555