在Hibernate中切切当现关联关系中的级联操作(cascading)[Java编程]
本文“在Hibernate中切切当现关联关系中的级联操作(cascading)[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
关系数据库系统本身就对比复杂,加上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 ([外键的定义])
其办理办法也是一样的.
以上是“在Hibernate中切切当现关联关系中的级联操作(cascading)[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |