在Hibernate中,针对持久化实体的配置文件中有Cascade这样一个属性,顾名思义就是级联,也就是说在操作当前实体时,针对当前实体的操作会影响到相应配置的关联实体。比如针对当前实体进行保存操作时,会同时保存与其关联的实体,当然这种额外操作的产生取决于你是否在当前实体的配置文件中对关联实体的元素配置了Cascade属性。而需要进行级联的操作可能涉及到增加,修改,删除等相应的数据库操作,具体Cascade的取值则分为多种,如all,表示针对所有操作都会进行级联,如save-update,表示针对插入和修改会进行级联操作。对于Cascade的取值问题需要根本具体需求而定,这里没有一个统一的标准应该取怎样的值符合你的需要。从现实需求分析来决定应该如何取值。
这篇博文的主要目的当然不是在这里说明应该Cascade的取值问题,而是想在这研究讨论在进行级联删除操作时,在不同的关联关系中,级联删除的不同行为。我们知道对于关联关系的种类来说,主要分为一对一,一对一,一对多这三种,经过研究实践,我发现在Hibernate中,针对级联的操作针对不同的关联关系会有不同的行为表现。
在一对一关联关系中,当删除当前实体时,会同时级联删除关联实体,以解除两者的关联关系。
在一对多关联关系中,当删除一方实体时,会同时级联删除多方实体,以解除两者的关联关系。
在多对多关联关系中,根据我们对于多对多关联关系的不同处理情况,相应的级联删除行为会有所不同,如果将多对多的关联关系处理为两个一对多的关联关系时,也就是说这时存在一个中间实体用以表明两者的多对多关联关系,那么在删除其中一方实体时,相应的级联删除操作并不会直接删除中间实体,也就是两者的关联关系,而是在中间实体中将其中一方设置为NULL,这样两者的关联关系就相应的解除了,而如果我们将多对多关联关系不作特殊处理,将之当作纯粹的多对多关联关系,也就是说没有相应的中间实体,而只是在数据库中保持一个中间表来维护两者的关联关系,那么当我们在删除一方实体时,会相应的将数据库中的中间表的相应数据给直接删除掉。
上传的附件是我为上述各种处理情况写的一个DEMO,里面有详细的测试,运行测试即可轻易得出上述结论,在此供大家参考批评指正。
分享到:
相关推荐
Hibernate中Cascade和inverse的区别,讲解的很详细
http://blog.csdn.net/e421083458/article/details/8794127 该源码为Hibernate教程配套源码
1、在有外键的一方,可以维护关联关系,可以建立关联关系,同样也可以解除关联关系,可以任意删除本对象,如果在hbm.xml中设置了cascade="delete",也可以删除关联对象 2、在没有外键的一方,不可以维护关联关系,...
该属性只可能在双向关联中使用。 使用了该属性,将不能再使用@JoinColumn注解。因为@JoinColumn注解表示其所注解的属性将来通过set方法设值后,会与DB中哪个字段相关联。 mappedBy属性表示当前注解的关联属性...
和其它许多批注一样,在多对多关联中很多值是自动生成,党双向多对多关联中没有定义任何物理映射时,Hibernate根据以下规则生成相应的值,关联表名:主表表名+下划线+从表表名,关联到主表的外键名:主表名+下划线+...
所以,适当的做法是,删除主表的同时,关联表的信息也要同时删除,在hibernate中,只需设置cascade属性值即可。 cascade表示级联操作,在hibernate配置注解@OneToOne,@OneToMany,@ManyToMany,@ManyToOne中的属性...
该资源包括了hibernate开发中的常见关联映射的源代码,其中包括:one2one,one2many,many2many等,还有继承映射,inverse,fetch,cascade关键字的应用等,对初学者来说,是很实用的,难度适中,很好理解
该源程序代码可以帮助初学者迅速建立hibernate的关联映射的概念,且详细的讲解了cascade和inverse的用法,程序代码进行了详尽的描述,通俗易懂,容易上手
业务数据在内存中表现为实体域对象形式,而在关系数据库中表现为关系数据形式。数据访问代码负责把实体域对象持久化到关系数据库中。 2.1 直接通过JDBC API来持久化实体域对象 21 .2.2 ORM简介 27 2.2.1 对象-...
Hibernate注释大全收藏 声明实体Bean @Entity public class Flight implements Serializable { Long id; @Id public Long getId() { return id; } public void setId(Long id) { this.id = id; } } @Entity ...
当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级...
NULL 博文链接:https://huihai.iteye.com/blog/1243530
* 3.hilo 要在数据库中建立一张额外的表,默认表名为hibernate_unque_key,默认字段为integer类型,名称是next_hi(比较少用) * 例:@GeneratedValue(generator = "paymentableGenerator") * @GenericGenerator...
业务数据在内存中表现为实体域对象形式,而在关系数据库中表现为关系数据形式。数据访问代码负责把实体域对象持久化到关系数据库中。 2.1 直接通过JDBC API来持久化实体域对象 21 .2.2 ORM简介 27 2.2.1 对象-...
使用cascade和inverse优化区和街道关联关系 实现区和街道双向一对多关联关系
Company与Employee类之间为一对多多态关联关系,如果继承关系树的根类对应一个表,或者每个类对应一个表,那么就能映射Company类的employees集合。本节介绍如何映射多对一多态关联。如图14-11所示,ClassD与ClassA为...
一般在做双向多对一(一对多)关联关系映射的时候,一般会设置让一的一方放弃对关联关系的维护,以减少不必要的更新语句 一对一: 基于外键的一对一 Wife Husband id id name name h_id references Husband...
Java正则表达式 批量上传--采集 (多个文件夹) The Agile Way hibernate mapping文件中的标记详解:关系标记 ANT 安装使用及build.xml文档模板 inverse和cascade在关联更新中的作用 hibernate ...