cascade持久化 <o:p></o:p>
在Java程序中,对象与对象之间会透过某些关系互相参考,如果有一个对象已经是持久化对象,被它参考的对象直觉上也应该要持久化,以维持对象之间关联的完整性,这是藉由可达性完成持久化(Persistence by reachability)的基本概念。
如果将对象之间的关联想象为一个树形图,从某一个持久化物件为树根出发,父节点若是持久化对象,则被父节点参考到的子节点应自动持久化,而另一方面,如果有一子节点没办法藉由任何的父节点来参考至它,则它没有被持久化的需求,它应从数据库中加以删除。
Hibernate并没有完全实现以上的概念,它让使用者自行决定自动持久化的方式,当对象之间被指定关联(例如多对一、一对多等),您可以决定被持久化对象关联的暂存对象是否进行自动持久化与如何自动持久化。
以之前「多对一实体映像」主题为例,之前我们在设定好User类别中的Room属性之后,我们分别要对Room与User进行save(),在对象的关 系图上,基本上我们应实现的是储存User,而Room的持久化应自动完成,而不用我们再特地指定,为了达到这个目的,我们在映射多对一关系时可以使用 cascade来指定自动持久化的方式,例如修改User.hbm.xml为: <o:p></o:p>
User.hbm.xml<o:p></o:p>
<many-to-one name="room"></many-to-one>
column="ROOM_ID"<o:p></o:p>
class="onlyfun.caterpillar.Room"<o:p></o:p>
cascade="save-update"/><o:p></o:p>
预设上cascade是none,也就是不进行自动持久化,所以预设上我们必须对每一个要持久化的对象进行save(),在上面我们指定了cascade为save-update,这表示当我们储存或更新User时,自动对其所关联到的Room(暂时)对象进行持久化。
这边要注意的是,使用cascade自动持久化时,会先检查被关联对象的id属性,未被持久化的对象之id属性是由unsaved-value决定,预设 是null,如果您使用long这样的原生型态(primitive type)时,则必须自行指定默认值,所以在「多对一实体映像」的Room.hbm.xml的id映像上,我们必须改为: <o:p></o:p>
Room.hbm.xml<o:p></o:p>
<id name="id" unsaved-value="0" column="ROOM_ID"></id><o:p></o:p>
<generator class="increment"></generator><o:p></o:p>
<o:p></o:p>
如果您不想额外设定unsaved-value信息,则可以将long改为Long,这可以符合预设的unsaved-value为null的设定,关于unsaved-value进一步的介绍,可以参考这边:
http://www.hibernate.org.cn/76.html<v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype><v:shape id="_x0000_i1025" title="" style="WIDTH: 5.25pt; HEIGHT: 5.25pt" href="http://www.hibernate.org.cn/76.html" o:button="t" type="#_x0000_t75" alt="" outside="" page="" visit=""><v:imagedata src="file:///C:\DOCUME~1\ch\LOCALS~1\Temp\msohtml1\01\clip_image001.gif" o:href="http://www.javaworld.com.tw/confluence/images/icons/linkext7.gif"></v:imagedata></v:shape>
修改映像文件之后,我们可以使用以下的方式来储存数据: <o:p></o:p>
HibernateTest.java<o:p></o:p>
import onlyfun.caterpillar.*;<o:p></o:p>
import net.sf.hibernate.*;<o:p></o:p>
import net.sf.hibernate.cfg.*;<o:p></o:p>
<o:p> </o:p>
public class HibernateTest {<o:p></o:p>
public static void main(String[] args) throws HibernateException {<o:p></o:p>
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();<o:p></o:p>
<o:p></o:p>
Room room1 = new Room();<o:p></o:p>
room1.setAddress("NTU-M8-419");<o:p></o:p>
<o:p></o:p>
User user1 = new User();<o:p></o:p>
user1.setName("bush");<o:p></o:p>
user1.setRoom(room1);<o:p></o:p>
<o:p></o:p>
User user2 = new User();<o:p></o:p>
user2.setName("caterpillar");<o:p></o:p>
user2.setRoom(room1);<o:p></o:p>
<o:p></o:p>
Session session = sessionFactory.openSession();<o:p></o:p>
Transaction tx= session.beginTransaction();<o:p></o:p>
<o:p></o:p>
session.save(user1);<o:p></o:p>
session.save(user2);<o:p></o:p>
<o:p> </o:p>
tx.commit();<o:p></o:p>
session.close();<o:p></o:p>
<o:p> </o:p>
sessionFactory.close();<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
这次我们不用特地储存room了,透过cascade设定为save-update,被User关联到的对象,在储存或更新时,都会自动持久化,之后我们甚至可以如下来进行对象储存: <o:p></o:p>
Transaction tx = session.beginTransaction();<o:p></o:p>
User user = (User) session.get(User.class, new Long(1));<o:p></o:p>
Room room = new Room();<o:p></o:p>
room.setAddress("NTU-M5-105");<o:p></o:p>
user.setRoom(room);<o:p></o:p>
tx.commit();<o:p></o:p>
session.close();<o:p></o:p>
cascade的指定除了save-update之外,还可以使用delete、all、all-delete- orphan、delete- orphan,各个设定的作用,建议您查看参考手册9.8Lifecyles and object graphs,当中有详细的说明,而有关于可达性完成持久化(Persistence by reachability)的说明,可以参考Hibernate in Action的4.3。 <o:p></o:p>
分享到:
相关推荐
深入理解hibernate many-to-one(多对一)及 cascade(级联).
Ajax-Cascade-Ajax-Select.zip,这是一个现成的html/jquery源代码,演示了如何构建基于ajax的级联选择。,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和javascript。它用于创建...
使用肤色颜色空间建模+连通域处理及分析和Harr-cascade 方法进行人脸检测。1建立多种肤色模型,结合数学形态学滤波,完成人脸检测; 2利用Matlab 自带的计算机视觉系统工具箱实现单人及多人的人脸检测。 使用肤色...
\hibernate_配置cascade_及all-delete-orphan.doc
前端项目-cascade-framework,CSS framework that puts back the C in CSS
Laravel开发-eloquent-cascade Laravel雄辩的级联删除特征
Laravel开发-laravel-cascade-deletes 将应用程序级级联删除添加到雄辩的模型中。
ADR-MVSNet--A cascade network for 3D point cloud reconstruction--2022 ADR-MVSNet--A cascade network for 3D point cloud reconstruction--2022 ADR-MVSNet--A cascade network for 3D point cloud ...
资源来自pypi官网。 资源全名:django-postgres-delete-cascade-2.0a1.tar.gz
$ cd djangocms-cascade-vagrant 流浪 $ vagrant up 此脚本将运行几分钟。 最后,系统会提示您输入admin用户的密码。 SSH 进入 Vagrant 机器 $ vagrant ssh 启动运行服务器 $ source /home/vagrant/cascadedemo...
资源来自pypi官网。 资源全名:djangocms-cascade-0.14.3.tar.gz
资源分类:Python库 所属语言:Python 资源全名:bu-cascade-0.01.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
hibernate inverse和cascade的详细讲解,相当详细全面的对inverse和cascade区别和用法的讲解
hibernate 级联(cascade和inverse)一对多,Jar包,数据库建表语句都好了,只要修改一下,数据库配置文件,就可以使用了,使用junit进行测试。
Cascade R-CNN: 深入研究高质量物体检测
一个七电平的开环控制STATCOM-Cascade_STATCOM_open_loop.mdl 自己搭了个单相级联型七电平的STATCOM模型,用的开环控制,闭环的还没搭出来,请大家多多指点。
v-cascade带有vue.js的层叠选择器的一个可爱组件(同时支持PC和Mobile)中文文档简介演示屏幕快照基本选择器remote-s v-cascade带有vue.js的层叠选择器的一个可爱组件(同时支持PC和PC)和移动)中文文档简介演示...
Cascade Object Detection with Deformable Part Models. To appear in the Proceedings of the IEEE CVPR 2010. [2] P. Felzenszwalb, R. Girshick, D. McAllester, D. Ramanan. Object Detection with ...
Hibernate位于持久化层,是域模型和关系数据模型之间的桥梁。 1.1 应用程序的分层体系结构 1 1.1.1 区分物理层和逻辑层 2 1.1.2 软件层的特征 3 1.1.3 软件分层的优点 4 1.1.4 软件分层的缺点 4 1.1.5 Java...