cascade :
不管是单向多对一还是一对多,或者是双向的一对多关系,在一的一端映射文件中有一个set标签,在多的一端有many-to-one标签,拿前几篇笔记里讲的Grade和Student举例,此标签下都有一个cascade属性:
Grade.hbm.xml中:
<set name="students" cascade="save-update">
<key column="gradeId" ></key>
<one-to-many class="Student"/>
</set>
Student.hbm.xml中:
<many-to-one name="grade" class="Grade" column="gradeId" not-null="true" cascade="save-update"></many-to-one>
cascade表示级联:让操作级联到子实体,常见的有以下几个取值:
save-update:在保存和当前一端数据时,另一端数据可以一起保存.如上,假如Student.hbm.xml中设置了 cascade="save-update",那么在保存数据时,只需要保存Student就可以,hibernate会自动把它相关联的另一端的Grade的数据保存起来.
none:不级联(不写就是默认不级联)
delete:删除级联(不能在多的一端执行)
all:表示所有操作都级联
注意:
- cascade是级联操作,使得在一段操作数据时,可以级联操作在另外一端的数据
- 在多对一的关系中,多的一端不能操作级联为delete,一般在多的一端设为save-update
- 在一对多的关系中,如果一的一端设置为delete,多的一端不能指明外键为空
inverse:
在一的一端(Grade)的<set>标签中有一个inverse属性,:
<set name="students" inverse="false">
<key column="gradeId" ></key>
<one-to-many class="Student"/>
</set>
inverse属性表示由谁来管理关联关系,默认为false.
inverse="false":表示双方都可以管理关联关系,谁管理关系谁来维护,如果都管理了则双方都可以维护,当关系由多的一端(Student)来维护时,效率更高.因为如果关系由一的一端(Grade)来维护时,会多执行几个Update语句.
inverse="true":表示由多的一端来管理关联关系,不管一的一端是否管理关系,都由多的一端来维护关系.建议设为"true".
那么什么是管理关系呢? 假设Student中,执行了setGrade()方法时,将Grade实例赋给了Student实例,就表示Student类管理了关系,这到底什么意思呢?其实很简单,假如保存数据的时候,我们保存Student信息时,引用了Grade,那么保存时会维护Student和Grade的关系,即会在Student中存在Grade的外键值,否则,Student的外键值是为null的(当然前提是我们没有设置not-null="true"),