级联操作

来源:互联网 发布:cf装备淘宝店 编辑:程序博客网 时间:2024/05/16 08:50

在对象-关系映射文件中,用于映射持久化类之间关联关系的元素,如<set>,<many-to-one>,<one-to-one>元素,都有一个cascade属性,

它用于指定如何操纵与当前对象关联的其他对象。

 

none:在保存,更新或删除当前对象时,忽略其他关联的对象。他是cascade属性的默认值。

save-update:当通过Session的save(),update()以及saveOrUpdate()方法类保存或更新当前对象时,级联保存所有关联的新建的临时对象,并且级联更新所有关联的游离对象。

delete:当通过Session的delete()方法删除当前对象时,级联删除所有关联的对象。

all:包含save-update和delete的行为,此外,对当前对象执行evict() 或lock()操作时,也会对所有关联的持久化对象执行evict() 或lock()操作。

delete-orphan:删除所有和当前对象解除关联关系的对象。

all-delete-orphan:包含all和delete-orphan的行为

 

例如:

<set name="chidCategories" cascade="save-update" inverse="true">

    <key column="CATEGORY_ID"/>

    <one-to-many class="mypack.Category"/>

</set>

 

<many-to-one name="parentCategory" column="CATEGORY_ID" class="mypack.Category" cascade="save-update"/>

 

<set>元素中的cascade="save-update",因此在保存或更新当前category对象时,Session会调用getChildCategories()方法,导航到所有的子类别Category对象,然后对这些子类别Category对象进行级联保存或更新。

<many-to-one>元素的cascade="save-update",因此在保存或更新当前Category对象时,Session会调用getParentCategory()方法,导航到父类别Category对象,然后对父类别Category对象进行级联保存或更新,找到父之后,系统会自动找到其父的子节点进行更新。

假如有1000个Category游离对象相互关联,Session就会执行1000条多余的update语句,则影响应用程序的性能。解决办法时把<many-to-one>元素的cascade属性设置默认值none,而<set>元素的cascade属性设置为save-update。这样,Session在通过save()方法保存子对象时,就不会去找其父节点对象。因此Session在清理缓存时,只需要执行一条insert语句。

当然,如果当前对象还关联了子类别Category临时对象,Session会通过getChildCategories()方法导航到子类别Category临时对象,并对他们进行级联保存操作。