最近在给同窗进行调试代码时遇到级联删除的问题时,当时没能立马想到级联!等回宿舍后,却想起来了要设置级联cascade属性。所以就将级联的再做一个总结吧!如下:
级联操作
一.简单的介绍
cascade和inverse
l Casade用来说明当对主对象进行某种操作时是否对其关联的从对象也作类似的操作,常用的cascade:none,all,save-update,delete, lock,refresh,evict,replicate,persist, merge,delete-orphan(one-to-many)。一般对many-to-one,many-to-many不设置级联,在<one-to-one>和<one-to-many>中设置级联。
l inverse表示“是否放弃维护关联关系”(在Java里两个对象产生关联时,对数据库表的影响),在<one-to-many>和<many-to-many>的集合定义中使用,inverse=”true”表示该对象不维护关联关系;该属性的值一般在使用有序集合时设置成false(注意hibernate的缺省值是false)。
one-to-many维护关联关系就是更新外键。many-to-many维护关联关系就是在中间表增减记录。
注: 配置成one-to-one的对象不维护关联关系
二,属性的解析
class元素的lazy属性设定为true,表示延迟加载,如果lazy设为false,则表示立即加载。以下对这二点进行说明。
立即加载:表示Hibernate在从数据库中取得数据组装好一个对象(如:Student)后,会立即再从数据库取得数据组装此对象所关联的对象(如:Grade)。
延迟加载:表示Hibernate在从数据库中取得数据组装好一个对象(如:Student)后,不会立即再从数据库中取得数据组装此对象所关联的对象(如:Grade),而是等到需要时,才会从数据库取得数据组装此关联对象。
<one-to-one>元素的cascade属性表明操作是否从父对象级联到被关联的对象,它的取得可以是以下几种:
none:在保存,删除或修改当前对象时,不对其附属对象(关联对象)进行级联操作。它是默认值。
save-update:在保存,更新当前对象时,级联保存,更新附属对象(临时对象,游离对象)。
delete:在删除当前对象时,级联删除附属对象。
all:所有情况下均进行级联操作,即包含save-update和delete操作。
delete-orphan:删除和当前对象解除关系的附属对象。
<one-to-one>元素的fetch属性的可选值是join和select,默认是select。
当fetch属性设定为join时,表示连接抓取(Join fetching):Hibernate通过
在Select语句中使用outer join(外连接)来获得对象的关联实例或者关联集合。
当fetch属性设定为select时,表示查询抓取(Select fetching):需要另外发
送一条Select语句抓取当前对象的关联实体或集合。
三。代码练习
<set name="emps" cascade="save-update">
<key column="depart_id"/>
<one-to-many class="Employee"/>
</set>
<set name="students" table="taacher_student" inverse="true"><!-- table是用来指定中间表的属性 -->
<key column="teacher_id"></key><!-- 查找教师id时,链接中间表表的teacher_id -->
<many-to-many class="Student" column="student_id"></many-to-many>
</set>