快速业务通道

在Hibernate中正确实现关联关系中的级联操作(cascading) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19

在Hibernate中正确实现关联关系中的级联操作(cascading)

时间:2011-02-17

关系数据库系统本身就比较复杂,加上Hibernate的O/R映射层,复杂度加重了,很容易出现问题,本人将最近遇到的问题和解决方法做一个总结,整理在下面的一系列文章中

正确理解Hibernate的聚合类型(collection)的使用

在Hibernate中正确实现关联关系中的级联操作(cascading)

在Hibernate框架中编写持久对象类实现外键关联的几点注意事项

本文是第二篇,讲解在one-to-many(一对多)和many-to-one(多对一)关联关系中的cascade特性的声明方法。在使用过程中最关键点是:脑子中要有一张持久对象关系树及其状态图(状态分别是:Transient, Persistent, Detached),存在对象间关联关系时,如果使用了级联操作特性,要找到树的根对象(所以要用树,而不是图),从根往下级联操作,只做单方向的级联。

我们再次使用第一篇的例子,为了反映两者的关联关系,为User类我们声明如下一对多关系

<class name="User" table="USER"> ... <set name="preferences" cascade="all,delete-orphan" inverse="true"> <key column="USER_ID" not-null="true"/> <one-to-many class="Preference"/> </set> ... </class>

而为Preference类声明如下多对一关系

<class name="Preference" table="PREFERENCE"> ... <many-to-one name="user" column="USER_ID" not-null="true" foreign-key="ALLPREFERENCES" class="User"/> ... </class>

由上可见,在User和Preference的关系树中,User是根(root),另外还可以看到为Preference声明了一个not- null的外键。在理清了级联的顺序关系后,后续的持久化操作可以只对User进行即可,Preference的持久化由级联操作完成。

根据Hibernate的原理和官方建议,应该采用以下持久化方法:

session.save():用于将Transient状态的对象及其级联对象持久化(即在该session中,处于persistent状态),例如,创建新对象及其关联。

session.flush()或者事务提交(commit)操作:用于将处于presistent状态的对象修改的持久化,例如,从数据库将一个关联树调到Hibernate中,修改后再次入库。

session.update(), session.saveOrUpdate(), session.merge():一般只用于处于detached状态的对象修改后进行的持久化操作(这是Hibernate的一个重要特色,可以很好的处理业务层面的事务(transaction)跟数据库层面的事务的配合问题),当然,这些方法用于上一种情况也没有错

session.delete():删除对象

做了上述实现后并不能保证关联关系的级联操作的正确执行,进一步分析参见后续文章。

在实践中很容易触发以下异常:

org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): xxx

这主要是理不清级联关系造成的,按照本文和下一文介绍的方法可以排除。

还有一个异常:

Cannot delete or update a parent row: a foreign key constraint fails ([外键的定义])

其解决方法也是一样的。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号