欢迎访问:我的个人网站
多对多的级联操作
在建立完多对多的映射关系之后,可以尝试对其进行级联操作
###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.维护第三张表(关系表)
在本例中,可以通过修改第三张表的方式来指定学生由哪个老师教授,那个学生不再由老师教授等操作,因为这个表就是存储关系的,更改这个表也就是在更改关系,联系本例,可以对第三张表进行以下操作:
- 让某个老师教授一名学生(将表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);
//这样就解除了关系