`
xgbjmxn
  • 浏览: 269357 次
  • 性别: Icon_minigender_1
  • 来自: 新乡
社区版块
存档分类
最新评论

Hibernate传播性持久化攻略

阅读更多
    *
      Hibernate传播性持久化攻略
    * http://developer.51cto.com  2009-09-24 16:39  佚名  javanb  我要评论(1)

      Hibernate默认不实现所谓的可到达即Hibernate传播性持久化(persistence by reachability)的策略。每个Hibernate session的基本操作都有对应的级联风格(cascade style)。

      本文向大家介绍Hibernate传播性持久化(transitive persistence),可能好多人还不了解Hibernate传播性持久化(transitive persistence),没有关系,看完本文你肯定有不少收获,希望本文能教会你更多东西。

      对每一个对象都要执行保存,删除或重关联操作让人感觉有点麻烦,尤其是在处理许多彼此关联的对象的时候。 一个常见的例子是父子关系。考虑下面的例子:

      如果一个父子关系中的子对象是值类型(value typed)(例如,地址或字符串的集合)的,他们的生命周期会依赖于父对象,可以享受方便的级联操作(Cascading),不需要额外的动作。

      父对象被保存时,这些值类型(value typed)子对象也将被保存;父对象被删除时,子对象也将被删除。 这对将一个子对象从集合中移除是同样有效:Hibernate会检测到,并且因为值类型(value typed)的对象不可能被其他对象引用,所以Hibernate会在数据库中删除这个子对象。

      现在考虑同样的场景,不过父子对象都是实体(entities)类型,而非值类型(value typed)(例如,类别与个体,或母猫和小猫)。 实体有自己的生命期,允许共享对其的引用(因此从集合中移除一个实体,不意味着它可以被删除), 并且实体到其他关联实体之间默认没有级联操作的设置。Hibernate默认不实现所谓的可到达即Hibernate传播性持久化(persistence by reachability)的策略。

      每个Hibernate session的基本操作 - 包括 persist(), merge(), saveOrUpdate(), delete(), lock(), refresh(), evict(), replicate() - 都有对应的级联风格(cascade style)。 这些级联风格(cascade style)风格分别命名为 create, merge, save-update, delete, lock, refresh, evict, replicate。 如果你希望一个操作被顺着关联关系级联传播,你必须在映射文件中指出这一点。例如:

         1. <one-to-one name="person" cascade="persist"/>

      级联风格(cascade style)是可组合的:

         1. <one-to-one name="person" cascade="persist,delete,lock"/>

      你可以使用cascade="all"来指定全部操作都顺着关联关系级联(cascaded)。 默认值是cascade="none",即任何操作都不会被级联(cascaded)。

      注意有一个特殊的级联风格(cascade style) delete-orphan,只应用于one-to-many关联,表明delete()操作 应该被应用于所有从关联中删除的对象。

      建议:

      通常在或关系中应用级联(cascade)没什么意义。 级联(cascade)通常在 和关系中比较有用。

      如果子对象的寿命限定在父亲对象的寿命之内,可通过指定cascade="all,delete-orphan"将其变为自动生命周期管理的对象(lifecycle object)。

      其他情况,你可根本不需要级联(cascade)。但是如果你认为你会经常在某个事务中同时用到父对象与子对象,并且你希望少打点儿字,可以考虑使用cascade="persist,merge,save-update"。

      可以使用cascade="all"将一个关联关系(无论是对值对象的关联,或者对一个集合的关联)标记为父/子关系的关联。 这样对父对象进行save/update/delete操作就会导致子对象也进行save/update/delete操作。

      此外,一个持久的父对象对子对象的浅引用(mere reference)会导致子对象被同步save/update。 不过,这个隐喻(metaphor)的说法并不完整。除非关联是关联并且被标记为cascade="delete-orphan", 否则父对象失去对某个子对象的引用不会导致该子对象被自动删除。 父子关系的级联(cascading)操作准确语义如下:

      如果父对象被persist(),那么所有子对象也会被persist()

      如果父对象被merge(),那么所有子对象也会被merge()

      如果父对象被save(),update()或 saveOrUpdate(),那么所有子对象则会被saveOrUpdate()

      如果某个持久的父对象引用了瞬时(transient)或者脱管(detached)的子对象,那么子对象将会被saveOrUpdate()

      如果父对象被删除,那么所有子对象也会被delete()

      除非被标记为cascade="delete-orphan"(删除“孤儿”模式,此时不被任何一个父对象引用的子对象会被删除), 否则子对象失掉父对象对其的引用时,什么事也不会发生。 如果有特殊需要,应用程序可通过显式调用delete()删除子对象。

      最后,注意操作的级联可能是在调用期(call time)或者写入期(flush time)作用到对象图上的。所有的操作,如果允许,都在操作被执行的时候级联到可触及的关联实体上。然而,save-upate和delete- orphan是在Session flush的时候才作用到所有可触及的被关联对象上的。

      本文只是大概的说明了Hibernate传播性持久化的应用,可能还有不足的地方,读者可以查更多的书去了解。
分享到:
评论

相关推荐

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    10.11. 传播性持久化(transitive persistence) 10.12. 使用元数据 11. 事务和并发 11.1. Session和事务范围(transaction scope) 11.1.1. 操作单元(Unit of work) 11.1.2. 长对话 11.1.3. 关注对象标识...

    spring + hibernate 数据话持久层

    在IT领域,特别是Java企业级应用开发中,Spring框架与Hibernate技术是构建高效、可维护的数据持久层的关键组件。从给定的文件标题、描述、标签以及部分内容中,我们可以提炼出以下关键知识点: ### Spring与...

    Hibernate实战(第2版 中文高清版)

     12.1 传播性持久化   12.1.1 按可到达性持久化   12.1.2 把级联应用到关联   12.1.3 使用传播性状态   12.1.4 利用JPA的传播性关联   12.2 大批量和批量操作   12.2.1 使用HQL和JPA QL的大批量语句  ...

    Spring Persistence with Hibernate

    《Spring Persistence with Hibernate》这本书聚焦于使用Spring框架与Hibernate结合来构建强大且可靠的持久化解决方案,适用于企业级Java应用程序。Spring框架是一个全面的后端开发框架,而Hibernate则是一个流行的...

    详解Hibernate事务处理机制

    它不仅简化了数据持久化的复杂性,还提供了一系列强大的功能来支持高效的数据访问与管理。在实际应用中,事务处理是确保数据一致性和完整性的关键环节之一。本文将深入探讨Hibernate中的事务处理机制,并通过具体...

    hibernate3 中文参考手册

    Hibernate通过使用XML文件或注解来实现映射,极大地简化了数据持久化层的代码,并且提高了开发效率。Hibernate3作为该框架的一个版本,提供了对数据库操作的抽象,使得开发者可以更加专注于Java代码,而不必深入了解...

    孙卫琴hibernate sourcecode6

    本部分主要涵盖了第21、22、23章的内容,涉及到了Hibernate在数据持久化、查询优化以及事务管理等多个关键领域的实现细节。 Chapter 21:持久化机制详解 在这一章节中,孙卫琴深入讲解了Hibernate的实体管理和持久...

    hibernate.zip

    综上所述,“hibernate.zip”文件中的内容应该涵盖了关于Hibernate框架的各个方面,包括基本概念、配置、映射、持久化操作、事务管理、缓存、关联映射、延迟加载以及事件监听。开发者可以通过解压和学习这些内容,...

    Hibernate_参考中文版

    Hibernate是一款开源的对象关系映射(Object Relational Mapping,简称ORM)框架,它为Java应用提供了对数据库的持久化操作支持,极大地简化了数据访问层的编码工作。该文档版本为2.1.6,主要介绍Hibernate的核心...

    hibernate 开发工具包

    8. **事件监听和拦截器**:Hibernate允许注册监听器来监听特定的生命周期事件,如持久化、更新等,可以实现自定义逻辑。拦截器则是在这些事件触发前后进行额外操作的机制。 9. **类型转换和定制化**:Hibernate支持...

    Hibernate中文Api最新参考文档

    Hibernate是一个开源的对象关系映射(ORM)框架,它为Java开发者提供了方便的数据持久化服务,使得开发人员可以使用面向对象的方式来操作数据库,而无需关心底层SQL语句的编写。本文档主要围绕Hibernate的最新中文...

    Hibernate学习笔记

    3. **应用需求**:对象持久化支持数据的共享、检索、管理和安全性,这是互联网应用中信息传播的核心需求。 ### 如何实现对象持久化? 在Java中,实现对象持久化的主要方式有两种:对象序列化和数据库技术。 1. **...

    用Hibernate和Spring开发持久层

    - Session接口:主要负责对象的持久化操作,如保存、更新、删除和查询。 - Criteria和HQL:两种查询语言,HQL是面向对象的查询,Criteria提供API进行动态查询。 2. Spring整合Hibernate: - 依赖注入:Spring...

    Hibernate3.1参考手册中文版.pdf

    **Hibernate 3.1:持久化框架的基石** Hibernate 是一个强大的开源对象关系映射(ORM)框架,它为Java开发者提供了数据持久化的解决方案。在Hibernate 3.1版本中,这个框架进一步完善了其功能,提升了性能,并增强...

    Hibernate+中文文档

    10.11. 传播性持久化(transitive persistence) 10.12. 使用元数据 11. 事务和并发 11.1. Session和事务范围(transaction scope) 11.1.1. 操作单元(Unit of work) 11.1.2. 长对话 11.1.3. 关注对象标识...

Global site tag (gtag.js) - Google Analytics