级联操作

在对象-关系映射文件中,用于映射持久化类之间关联关系的元素,如<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临时对象,并对他们进行级联保存操作。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值