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入门:搭建框架实现基本的增删改查** Hibernate 是一个开源的对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互。在本教程中,我们将深入理解Hibernate的基本概念,并通过实例演示如何...
**Hibernate入门** Hibernate是一款强大的Java持久化框架,它简化了数据库与Java对象之间的交互,使得开发者无需编写大量的SQL语句,就能实现数据的增删改查。本教程将分为五个部分,逐步深入Hibernate的世界。 **...
**hibernate入门** Hibernate 是一个强大的Java持久化框架,它简化了数据库操作,使得开发者无需直接编写SQL语句即可实现对象与关系数据库之间的映射。这个文档将带你步入Hibernate的世界,了解其基本概念和核心...
- **PO(Persistent Object)与VO(Value Object)**:PO表示持久层对象,用于持久化操作;VO表示值对象,用于传输数据。 - **特殊属性处理**:如`unsaved-value`用于标记未保存的对象状态。 - **Inverse和Cascade**...
- **cascade持久化**: - 控制级联保存、更新、删除操作。 - **双向关联与inverse设定**: - 在多对多、一对多等关联中管理引用方向。 - **延迟加载** (`LazyInitialization`): - 延迟加载关联对象,提高应用性能...
### Hibernate入门经典实例详解 #### 实验一:Hibernate开发框架搭建 **实验目的:** - 理解并掌握如何使用Hibernate进行持久层开发; - 了解三层架构的意义:业务逻辑层、数据持久层和数据库。 **技术要点:** ...
### Hibernate入门知识点详解 #### 一、Hibernate简介与优势 **1.1 JDBC与Hibernate** - **1.1.1 JDBC** - JDBC(Java Database Connectivity)是Java中用来规范客户端程序如何访问数据库的应用程序接口,提供了...
**Hibernate入门(上)** Hibernate 是一款开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序与数据库之间的交互。对于初学者来说,理解Hibernate的核心概念和基本操作至关重要。本教程将引导你逐步了解...
Session是与数据库交互的接口,提供了持久化对象的主要操作。SessionFactory通常在应用启动时创建一次,然后在整个应用生命周期中复用。 五、对象状态与操作 在Hibernate中,对象有三种状态:瞬时态、持久态和脱管...
Hibernate 是一个开源的对象关系映射(ORM)框架,它为Java开发者提供了强大的工具来管理和持久化应用程序中的数据。对于初学者来说,理解并掌握Hibernate的关键概念和技术是非常重要的,因为这可以极大地提高开发...
**Hibernate入门教程** Hibernate是一个强大的Java对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以更专注于业务逻辑而不是数据库层面的细节。本教程将帮助初学者理解Hibernate的核心概念,通过实例...
- Entity:代表数据库中的表,是Hibernate中的持久化类。 - Identifier:每个Entity都有一个唯一的标识符,对应数据库中的主键。 - Cascade:级联操作,可以设置对象间的操作传播,如一个对象被删除时,其关联的...
在学习Hibernate时,首先要理解它的核心概念,包括实体(Entity)、持久化类(Persistent Class)、对象状态(Object State)、会话(Session)和事务(Transaction)。实体是应用程序中与数据库表相对应的Java类,...
Hibernate 简介与入门 #### 1.1 第一部分 - 第一个 Hibernate 应用程序 - **设置**:首先,开发者需设置开发环境,包括导入 Hibernate 库和其他依赖库,如 JUnit。 - **第一个 class**:创建一个简单的 Java 类...
2. `CascadeType.PERSIST`:如果关联的对象没有ID,那么就进行持久化操作。 3. `CascadeType.MERGE`:合并实体的状态,通常用于恢复事务中的临时状态。 4. `CascadeType.REMOVE`:删除关联的对象。 5. `CascadeType....