简单地说,“inverse”决定哪一边来更新外键,而“cascade”决定接下来应该执行什么操作。在关系上来看两者看上去非常相似,但实际上是完全不同的两回事。
inverse
inverse,英文意思是反向,反转。在这里可以理解为控制反转,也就是说实体间的关系由谁控制,所以inverse用在实体关联上。如OneToOne,OneToMany,ManyToMany,在OneToMany中,如果不指定inverse,(inverse通过mappedBy来设置)那么hibernate会去找默认的表来维持关系。
这个关键字被用来决定关系的哪一方是负责维护关系的关系所有者(插入或更新外键列)
下面给出一个示例,关系所有者属于stockDailyRecords(inverse=true)
<!-- Stock.hbm.xml -->
<hibernate-mapping>
<class name="com.demo.common.Stock" table="stock" ...>
...
<set name="stockDailyRecords" table="stock_daily_record" inverse="true">
<key>
<column name="STOCK_ID" not-null="true" />
</key>
<one-to-many class="com.demo.common.StockDailyRecord" />
</set>
...
当我们保存或更新stock对象时,Hibernate将只插入或更新STOCK表,而不更新外键列。
cascade(级联)
在级联中,在完成一个操作(增、删、改)之后,它决定自己是否需要在另一个与它有关系的实体上调用其他操作(增、删、改)。级联的注解形式有两种:
基于Hibernate的注解形式:
ALL,//所有操作都会有级联反应
PERSIST//级联持久化,调用session.persist()时会触发级联事件
MERGE//级联保存或者更新,hibernate为了支持jpa规范添加的,调用session.merge()时触发
REMOVE,//级联删除,jpa规范同上,调用session.delete()时触发
DELETE,//级联删除,session.delete()触发
SAVE_UPDATE,//级联保存或者更新session.save(),update(),saveOrUpdate()会触发;
REPLICATE,//调用session.replicate()触发
REFRESH,//调用session.refresh()触发
LOCK,//调用session.lock()触发
DETACH,//与持久对象关联的Session被关闭后触发
基于JPA规范,也就是apache jsr220规范,也是EJB3的持久层规范:
ALL,//所有操作都会有级联反应
PERSIST,//调用session.persist()时触发
MERGE,//调用session.merge()触发
REMOVE,//调用session.delete()触发
REFRESH,//调用session.refresh()触发
DETACH,//与持久对象关联的Session被关闭后触发
具体注解的配置用法请看我之前的博文
下面给出一个XML配置示例,在这个例子中,在Stock.hbm.xml的stockDailyRecords内声明了cascade="save-update"级联。
<!-- Stock.hbm.xml -->
<hibernate-mapping>
<class name="com.demo.common.Stock" table="stock" ...>
...
<set name="stockDailyRecords" table="stock_daily_record" cascade="save-update" inverse="true">
<key>
<column name="STOCK_ID" not-null="true" />
</key>
<one-to-many class="com.demo.common.StockDailyRecord" />
</set>
...
当我们保存或修改stock对象时:它将插入或更新记录到STOCK表中,并在StockDailyRecord上调用另外的插入或更新语句(cascade="save-update")
分享到:
相关推荐
Hibernate中cascade与inverse属性详解
级联操作允许我们将对一个实体的更改自动应用到与之关联的其他实体。在一对多关系中,如果一个实体(父实体)与多个实体(子实体)关联,设置级联属性可以确保在处理父实体时,子实体的操作也会随之进行。例如,当...
在 Hibernate 框架中,`cascade` 和 `inverse` 是两个重要的概念,它们主要用于管理对象之间的持久化关系,特别是涉及到一对一(one-to-one)、一对多(one-to-many)和多对多(many-to-many)关系时。这两个属性都...
在这些配置选项中,`inverse`和`cascade`是最具挑战性的两个概念之一。它们主要用于控制对象之间关联关系的维护以及操作的级联行为。本文将详细介绍这两个属性的概念、作用以及应用场景,并通过示例来帮助读者更好地...
总之,理解并熟练运用Hibernate的关联映射、cascade和inverse是提升Java持久化编程能力的关键步骤。它们可以帮助我们更高效地管理对象与数据库之间的关系,同时降低开发复杂度。通过实践和研究给出的示例,相信你...
在探讨Hibernate框架中的级联操作(cascade)与控制权反转(inverse)之前,我们需要先对Hibernate有一个基本的理解。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用提供了一种将对象模型映射到...
在Hibernate框架中,cascade选项提供了一种管理实体间关联的便捷方式,使得对一个实体的操作能够自动地应用到与之相关的其他实体上。这对于处理复杂的数据库关系非常有用,可以极大地简化代码,并减少出错的可能性。...
在数据库关系中,“cascade”意味着一个操作(如更新、删除)不仅会影响主记录,还会影响与之相关联的所有子记录。比如,如果部门被删除,而设置的外键约束为“cascade”,那么所有属于该部门的员工记录也会被删除。...
Hibernate中Inverse和Cascade的区别.html
在深入探讨Hibernate集合映射中的`inverse`与`cascade`属性之前,我们首先需要理解Hibernate框架的基本概念。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用程序提供了一种将对象模型与数据库...
在软件网络技术领域,尤其是在使用Hibernate这种对象关系映射(ORM)框架时,理解和正确使用`cascade`和`inverse`属性至关重要。这两个属性主要用于管理对象之间的关联关系,特别是如何在数据库中维护这些关系。 ...
1. **关联的插入和更新**:在一对多关系中,如果设置`inverse="true"`,那么在保存或更新父实体时,Hibernate会自动处理与子实体的关联,添加新的子实体或更新已存在的关联。相反,如果在子实体上操作,Hibernate将...
hibernate中一对一,一对多,多对多关系的配置,延迟加载,cascade,inverse hibernate查询方式概述,HQL查询,QBC查询,分页,结果集封装方式 ,高级查询 查询的优化,一级缓存,二级缓存,批量查询,注解方式
当在主对象上执行保存、更新、删除等操作时,是否将这些操作“级联”到与之关联的子对象。例如,如果你有一个`Student`类,它与`Teacher`类有一对多的关系,并且`Student`包含在`Teacher`中,设置`cascade`属性可以...
描述提到“使用cascade和inverse优化区和街道关联关系”,这意味着我们将深入理解Hibernate的cascade和inverse属性,以及它们在双向一对多关联关系中的应用。 Hibernate是Java领域中广泛使用的对象关系映射(ORM)...
当在实体间设置`cascade`时,例如在一对多或多对多关系中,如果你在一个对象上执行`save()`, `update()`, `delete()`等操作,这些操作将自动传播到与之相关联的对象。例如,如果你在一个学生对象上删除操作,并且该...
根据提供的文件信息,我们可以深入探讨Hibernate框架中的几个关键概念,特别是`fetch`, `lazy`, `cascade`, 和 `inverse`关键字的使用与理解。这四个概念在处理对象关系映射(ORM)时非常重要,尤其是在Java环境下...
在Hibernate这个强大的对象关系映射(ORM)框架中,`inverse`属性是一个非常重要的概念,它主要用于管理关联关系的维护责任。在这个例子中,我们将会深入理解`inverse`属性的作用,并通过一个简单的测试案例——`...