`
xinklabi
  • 浏览: 1588028 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
文章分类
社区版块
存档分类
最新评论

Hibernate级联(cascade)与反转(inverse)介绍汇总

 
阅读更多

来源:http://www.tianxiaboke.com/u/lyeerwy

级联保存和更新
当Hibernate持久化一个临时对象时,在默认情下,他不会自动持久化所关联的其他临时对象,如果希望当持久化对象时把他所关联的所有临时对象进行持久化的话:可以把 的cascade属性设置为"save-update" ,cascade的默认属性值为none。
cascade:设置操作对象时的级联操作,即层级之间的连锁操作
值 save-update :表示当保存和更新当前对象(即insert和update语句时),会级联保存和更新与他关联的对象
值 all :表示任何情况下都会进行级联操作,即对一个对象进行操作,也会对和他关联的其他对象进行同样的操作
值 delete :表示在执行delete时,进行级联操作,删除和他关联的对象
值 none :表示任何情况下,都不会进行级联操作
<set>元素的inverse属性

在运行上面的程序时,如果hibernate的"show-sql"设置为true时,就会看到Hibernate会生成很多sql语句,其实很多sql语句都是重复的
eg:
insert into test.order(o_name,c_id)values(?,?)
insert into test.order(o_name,c_id)values(?,?)
insert into test order set c_id=? where id=?
insert into test order set c_id=? where id=?

为了解决这个问题,我们可以利用在<set>标签中加上inverse属性。术语:inverse是指反转的意思,在Hibernate中,表示关联关系中的方向关联关系中,inverse="false"的主控方,由主动方负责维护对象关系我们 在customer对象的对象配置文件中加上

<set name="orders" cascade="save-update" inverse="true">
<key column="c_id" > </key>
<one-to-many class="net.mbs.mypack.Order " />
</set>

声明在Customer和Order的双向关联关系中,Customer端的关联只是Order端关联的镜象(即Order端是主空端,负责维护Customer和order对象之间的关联关系),当hibernate探测到持久化对象Customer或Order的状态发生变化时(主要是关联关系的改变),仅按照Order对象的状态的变化来同步更新数据库。
按次配置,如果在程序中,我们仅仅使用Customer.getOrder().add(order)(涉及了和Order的关联关系的改变),是不能让数据库跟对象的变化来进行数据库同步更新的,只有利用Order对象的方法改变的Order对象状态(eg:order.setCustomer(customer)----涉及到了和Customer的关联关系的改变)时,数据库才会根据变化来同步更新数据库,即只有主控方的状态(涉及到了和另一方面的关联关系的改变)发生了变化后,才会触发对象和数据库的同步更新。

映射一对多双向关联关系
当类与类之间建立了关联,就可以方便的从一个对象导航到另一个对象或一组与他关联的对象当中,根据上面的程序,对于一个给定的Order对象,如果想获取与他关联的Customer对象,我们只需要调用入下方法:
Customer c=order.geCustomer(); 那么当我们得到一个Customer对象后,想查出和这个Customer对象关联的所有Order对象时,应该怎么办呢?由于在Customer中没有建立对Order对象的关联,所以,不能通过加载Customer对象来自动加载和他关联的所有Order对象,唯一的方法只能通过JDBC或SQL语言人工写出代码来查询数据库Order表来返回所需要的信息(这里好像不对,若配置了双向一对多,可以在一方使用getSet或是getList取得数据的)
上面的问题虽然解决,但不能算是最好,因为这样性能会有所下降,对象位于内存中,在内存中从一个对象导航到另一个对象显然比到数据库中查询数据要快得多

具体实现<br>
1:由于Customer和Order是一对多,即一个Customer要对应多个Order,所以在Customer中应该建立一个Set对象,用于存放和本Customer对象关联的所有Order对象。
2:在customer.hbm.xml通过<one-to-many>建立对Order表的关联关系
注意:<one-to-many>应该放置在<set>标签中
我们先来看看Customer类的设计和customer.hbm.xml文件的内容
<br><br><br>------------------------------------------------------
Customer Order 双向一对多
1:Customer类中建立一个容器对象,包含关联的所有Order对象
2:Order类中建立一个Customer对象,关联Customer
inverse="true"表示将维护关联的权利交给引起Hibernate语句的生成

customer.getOrders().add(order);
customer.setName("dddddd");

inverse="true"(设置此属性的一方----是被控方)
当主控方修改对象之间的关联关系时,让Hibernate生成sql语句

分享到:
评论

相关推荐

    hibernate 级联(cascade和inverse)一对多

    一、Hibernate级联(Cascade) 级联操作允许我们将对一个实体的更改自动应用到与之关联的其他实体。在一对多关系中,如果一个实体(父实体)与多个实体(子实体)关联,设置级联属性可以确保在处理父实体时,子实体...

    Hibernate_级联关系说明_-_关于cascade和inverse的用法

    在探讨Hibernate框架中的级联操作(cascade)与控制权反转(inverse)之前,我们需要先对Hibernate有一个基本的理解。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用提供了一种将对象模型映射到...

    Hibernate 一对多、多对一、级联、加载、反转

    在Java持久化框架Hibernate中,一对多(One-to-Many)、多对一(Many-to-One)、级联(Cascading)、加载(Loading)和反转(Inversing)是关系映射的重要概念,它们对于理解如何在数据库和对象之间有效地管理关联至...

    Hibernate级联操作.docx

    在 Hibernate 中,级联操作(Cascade)和反向属性(Inverse)是管理对象关系的重要概念,特别是在处理一对多(One-to-Many)或多对一(Many-to-One)关系时。 **级联操作(Cascade)** 级联操作定义了当主对象被...

    hibernate xml

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者...理解`cascade`和`inverse`的概念,能够帮助我们更好地设计对象模型,避免数据同步的问题,同时,灵活运用级联操作可以简化业务逻辑。

    hibernate结构框架及组要实现类的深入分析

    **Hibernate 核心类介绍** - **Configuration**:读取配置文件并解析 `.hbm.xml`,生成 PersistentClass 和 Collection。 - **PersistentClass**:表示要持久化的类的信息,包括其属性列表(Property)和每个属性的 ...

    3.Hibernate 03 表关系详细教案1

    总结,本教程详细介绍了Hibernate中表关系的映射,包括不同关系的配置、`Cascade`和`Inverse`属性的使用,以及如何在Java类和XML配置文件中实现这些映射。理解并掌握这些概念对于高效使用Hibernate进行数据库操作至...

    Hibernate表间关联ppt课件.ppt

    使用`&lt;set&gt;`标签定义多对多关系,包括中间表名、延迟加载、级联操作和反转标志(`inverse`)。 7. 延迟加载(Lazy Loading): 默认情况下,Hibernate使用懒加载来提高性能,只在真正需要时才加载关联的对象。 8....

    Hibernate关系映射

    可以通过`inverse`属性反转维护责任,使一的一方负责外键的更新。 **四、在web系统中的应用** 在实际的web系统中,"多对一"关系映射常用于构建复杂的业务逻辑。例如,用户订单和商品的关系,一个订单可能包含多个...

    Hibernate映射一对多关联关系

    - `inverse` 设置是否反转该关联关系。 - `cascade` 定义级联行为。 - `lazy` 控制延迟加载机制。 - `&lt;key&gt;` 元素定义外键。 - `&lt;one-to-many&gt;` 元素指定集合中的元素类型。 #### 五、API操作 利用Hibernate API...

    hibernate配置文件

    本文档旨在总结和解释Hibernate中的多种关联模式及其配置方式,同时也会介绍在不同数据库环境下(如MySQL和Oracle)的连接配置方法。 #### 二、数据库连接配置 ##### MySQL数据库配置示例 ```xml ...

    hibernate学习笔记

    - **cascade**:可选属性,表示级联操作。 - **order-by**:可选属性,默认为无,表示排序依据。 - **where**:可选属性,默认为无,表示过滤条件。 - **batch-size**:可选属性,表示批处理大小。 - **outer-join**...

    spring hibernate struts

    - **cascade**:级联操作,当一个对象被持久化时,关联的对象也会被自动持久化。 - **inverse**:反转控制,用于指定关联关系的维护方。 - **LazyLoading**:延迟加载,只有当真正需要时才加载关联对象。 ##### 4.6...

    Spring相关资料

    - 在一对多的配置中,`cascade`属性可以用来指定级联操作,例如`cascade="all"`表示级联所有操作(如保存、更新、删除等)。 ### 结论 以上知识点覆盖了Spring框架的基本概念及其与Hibernate、Struts等技术的集成...

    java程序员葵花宝典

    - 级联操作:通过`cascade`属性设置级联行为,例如`cascade="all"`表示所有操作都级联。 - 延迟加载:通过`lazy="true"`属性开启延迟加载模式。 - **示例代码**: ```xml &lt;set name="orders" cascade=...

    y2_java单词

    4. **cascade**:级联操作指一个对象的改变会影响到与其相关联的对象,例如删除一个父对象时,可能会同时删除所有子对象。 5. **inverse**:反转关系意味着在一个双向关联中,指定哪个端负责维护关联关系。 6. **...

    java笔试题.pdf

    - **Hibernate的inverse、cascade、fetch、lazy**:这些是Hibernate的持久化策略,inverse用于管理关联关系的维护,cascade控制操作的级联,fetch决定加载关联数据的方式,lazy是懒加载策略。 这些知识点都是Java...

    学软件编程需必学的英语)第二学年Java方向

    6. **Inverse反转**:通常与双向关联关系中的维护者有关,决定哪一方负责关联的维护。 7. **Employee雇员**:租房系统中的用户角色之一,可能涉及到租户或物业管理人员。 8. **Project项目**:可能指代具体的租房...

    JavaEE技术面试常见问题.doc

    - **cascade**:级联操作。 5. **Hibernate中的延迟加载** - **概念**:在真正需要时才加载关联对象。 - **用途**:提高性能,减少内存占用。 6. **Hibernate缓存机制** - **一级缓存**:会话级别的缓存,...

Global site tag (gtag.js) - Google Analytics