cascade 级联:让操作级联到子实体
一般常见的由四个值:
save-update
delete
none
delete
下面一一介绍
save-update :保存和更新多的一端的数据时,一的一端的数据可以一起保存和更新
如下是原来的代码
Grade grade=new Grade();
grade.setName("基础");
Student stu=new Student();
stu.setName("张三疯");
stu.setAge(22);
stu.setGrade(grade);
Student stu1=new Student();
stu1.setName("老王");
stu1.setAge(23);
stu1.setGrade(grade);
/*如下,如果没有级联,我们必须先保存grade的值再保存stu的值,如果我们在多的一端设置了save-update,那么下面就不用了,保存合更新多的一端的时候会一起保存一的一端*/
/*session.save(grade);*/
session.save(stu);
session.save(stu1);
上述在保存stu的时候会保存年级,但是在保存stu1的时候,年纪已经存在,就不会再保存了
cascade配置如下
<many-to-one name="grade" class="Grade" column="grade_Id"
not-null="true" cascade="save-update">
</many-to-one>
delete:删除级联在多对一的关系中,多的一端不能操作级联为delete。一般在多的一端设为save-update.
因为多的一端只是外键引用了一的一端的数据,删除多的一端一的一端的数据不能跟着删除,因为多的一端的其他数据也有可能引用了这歌数据对应的一的一端的数据,就算没有,也不能。因为多的一端是依赖于一的一端的数据的,而不是被依赖。
如果一的一端设置为delete时,多的一端不能指明外键为非空,因为会先先把外键设置为空再进行删除操作
none:默认值,不级联 不配置cascade的时候就是none
all:所有都级联,在多的一端相当于sava-update,因为在多的一端delete不起作用。
inverse 不配置默认都是false inverse只存在于集合标记的元素中
Inverse设置关系维护方。当inverse=”false”时,谁管理关系谁维护。如果都管理了,那么都维护。当关系由多的一端来维护时,效率较高。当关系由一的一端来维护时。会多执行update语句。
当多的一端维护(就是通过多的获取一的一端的数据) 先保存年级,再插入学生数据(此时年级的外键数据也被插入了)
当一的一端维护(通过一的一端获取多的一端的数据) 先保存年级,再插入学生数据(但是年级的外键数据为空),再更新学生数据中的年级外键约束
Inverse=”true”时,关系由另一端管理。不管一的一端是否指明关系,一的一端都不会去维护关系。都由多的一端负责。建议inverse=”true”.这样就算一的一端指明了关系,通过一的一端获取多的一端的数据,学生表中的外键值为空,不会有值,也就是不会执行update语句。
inverse只存在于集合标记的元素中,也就是说只能一的一端配置
<set name="students" inverse="true" >
<key column="grade_id" ></key>
<one-to-many class="Student"></one-to-many>
</set>