简单地说,“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)一对多,Jar包,数据库建表语句都好了,只要修改一下,数据库配置文件,就可以使用了,使用junit进行测试。
Hibernate中cascade与inverse属性详解
Hibernate中cascade和inverse应用
于Hibernate中 cascade 与 inverse 的理解。 您买的Hibernate书是哪一本呢? 孙卫琴的精通Hibernate,还是 深入浅出Hibernate还是那本。。。 我是两本都买了,总体来说还可以,但是,有的地方讲的比较书面化,比如...
hibernate inverse和cascade的详细讲解,相当详细全面的对inverse和cascade区别和用法的讲解
inverse Hibernate_级联关系说明_-_关于cascade和inverse的用法
该源程序代码可以帮助初学者迅速建立hibernate的关联映射的概念,且详细的讲解了cascade和inverse的用法,程序代码进行了详尽的描述,通俗易懂,容易上手
Hibernate中Inverse和Cascade的区别.html
hibernate集合映射inverse和cascade详解.txt
Hibernate fetch lazy cascade inverse 关键字
Hibernate中cascade和inverse的相关
hibernate中一对一,一对多,多对多关系的配置,延迟加载,cascade,inverse hibernate查询方式概述,HQL查询,QBC查询,分页,结果集封装方式 ,高级查询 查询的优化,一级缓存,二级缓存,批量查询,注解方式
使用cascade和inverse优化区和街道关联关系 实现区和街道双向一对多关联关系
<set name="products" table="products" cascade="all" inverse="true"> <!-- Hibernate只会缓存对象的简单属性的值, 要缓存集合属性,必须在集合元素中也加入子元素 而Hibernate仅仅是把与当前持久对象关联的...
本章介绍一对多关联关系的映射方法,重点介绍inverse属性和cascade属性的用法。本章还将介绍通过Hibernate API来保存、修改和删除具有关联关系的对象的方法。 7.1 建立多对一的单向关联关系 148 7.1.1 [many-to-...
<set name="emps" inverse ="true" lazy="true" cascade="none" batch-size="2" fetch="join" > </hibernate-mapping> Hibernate映射多对一: public class Emp implements java.io.Serializable {...
该资源包括了hibernate开发中的常见关联映射的源代码,其中包括:one2one,one2many,many2many等,还有继承映射,inverse,fetch,cascade关键字的应用等,对初学者来说,是很实用的,难度适中,很好理解
AUTO 生成器,适用与可移值的应用,多个@Id可以共享同一个 identifier生成器,只要把generator属性设成相同的值就可以。通过@SequenceGenerator 和 @TableGenerator 可以配置不同的 identifier 生成器。 table=...