九、关联关系中的高级应用
1.级联操作:
在前面的一对多操作中已经有所体现,现在回到前面的一对多操作中,进行一些修改,修改内容如下:
Set<Employee> emps = new HashSet<Employee>();
emps.add(emp1);
emps.add(emp2);
depart.setEmps(emps);
去掉这段注释,并把“s.save(emp1); s.save(emp2);”注释掉,然后运行发现出错。原因是:当我们保存Department depart对象时,发现它所关联到的两个Employee emp对象并未保存,而这种要依赖别的对象的操作即是级联操作,级联操作主要体现在关联关系中,且是可配置的,只是默认的级联操作是被设为”none”,而如果我们希望进行级联操作,只需要在<set>配置中增加cascade属性,比如我们现在Department.hbm.xml 的<set>元素下增加cascade="save-update"属性后,再来执行会发现正常,原因是Hibernate进行了级联操作,相当Hibernate帮我们写了注释掉的“s.save(emp1); s.save(emp2)”这两句内容。下面列表说明级联操作的可选值。
cascade属性值
|
功能作用描述
|
none
|
在保存、修改对象时,不对与之关联的对象进行任何操作,它作为cascade默认值。
|
save-update
|
当保存或修改对象时,级联保存所有与之关联的临时对象,级联更新所有与之关联的脱管(游离)对象。
|
delete
|
当删除时,级联删除所有与之关联的对象
|
all
|
包括save-update和delete两种行为
|
delete-orphan
|
删除所有和本对象解除关联关系的对象,主要表现在“一对多”中。
|
all-delete-orphan
|
包括all和delete-orphan的行为
|
说明:(1)cascade可以在<set><list><bag><map>中进行配置,即在“多对一”、“一对多”、“多对多”、“一对一”这些关联关系中,“级联”都是可配的在一般的对象中不能配置。(2)可以为其配置多个属性值,中间用逗号分隔。如cascade=”save-update,delete”.(3)一般只在“一对一 一对多”配置级联,而不会在“多对一 多对多”中配置级联,但在配置时最好的方法是根据实际情况进行配置。现举例说明:比如在“部门和员工”之间,如果我们希望部门取消时,属于该部门的员工并不会被取消,而是分到的别的部门,我们就不应为cascade配置“delete”值。
2.inverse属性:
inverse的作用:询问是否放弃维护关系,默认是false,即不放弃维护关系,即要维护关系。下面借助前面的“一对多”实例来详谈“维护关系问题”。
static void add() {
Session s = null;
Transaction tx = null;
try {
Department depart = new Department();
depart.setName("departName");
Employee emp1 = new Employee();
emp1.setName("empName1");
emp1.setDepart(depart);//员工维护它们之间的关系
Employee emp2 = new Employee();
emp2.setName("empName2");
emp2.setDepart(depart);
Set<Employee> emps = new HashSet<Employee>();
emps.add(emp1);
emps.add(emp2); //员工维护它们之间的关系
depart.setEmps(emps); //部门维护它们之间的关系
s = HibernateUtil.getSession();
tx = s.beginTransaction();
s.save(emp2);
s.save(emp1);
s.save(depart);
//以上的代码的书写顺序分两种情况讨论
tx.commit();
} finally {
if (s != null)
s.close();
}
}
下面借助上面的代码来进行分析:一种情况下是员工维护它们之间的关系。其中的关键代码为已在上面说明(即emp1.setDepart(depart),emp2.setDepart(depart)):此时,我们再注释掉部门维护关系的代码(即注释掉depart.setEmps(emps);),然后执行;执行后再交换s.save(emp2); s.save(emp1);s.save(depart);的保存顺序,再执行。
第二种情况是,部门维护它们之间的关系,需注释掉员工维护关系,再分保存的顺序讨论。
第三种情况是,共同维护它们之间的关系。
下面再列表说明:
|
先保存员工,再保存部门
|
先保存部门,再保存员工
|
员工维护关系
|
由于是员工维护关系,当我们先保存员工再保存部门时,会自动把部门信息更新到员工表中,这时会有两条更新操作。
|
由于先保存了部门信息,然后再来保存员工时,便能获知部门信息,所以只进行了插入操作,不会有任何更新操作。
|
部门维护关系
|
由于是部门来维护关系,不论怎样的保存顺序,最终都会有两条更新操作。原因是我们要更新的是员工表,当我们最终保存好部门和员工后,都会再把部门信息更新到员工表中。
|
共同维护关系
|
4条更新操作,结合上面分析
|
2条更新操作,结合上面分析。
|
分析了上面的维护关系情况,下面再来讨论由谁来维护关系:举例,在“一对多”中,如果让“一”来维护关系,相对就低效,如果让“多”来维护关系,则会在效率上有很大的提高。再据此举个生活中的例子,一个老师会有多个学生,如果让老师来维护关系,让老师来记住学生,这将会很难,但如果我们让学生来维护关系,即让每个学生来记住老师,这样将会使效率上有很大的提高,所以通常在关联关系中,我们总是会让“多”这方来维护关系,而让“一”这方放弃维护关系。因此我们需要在“一”的一方配置“inverse”属性,让它来放弃维护关系。为什么要一方放弃维护关系?在上面的例子中,我们在讨论让双方共同维护关系时,会发现有重复的操作,这就是为什么要提出放弃维护关系的原因,在前面的“多对多”实例中,如果让双方都来维护关系将会报错,原因很简单:“多对多”采取的中间表关联,而双方维护关系,将会试图在中间表插入重复的记录,当然是不可行的,至于在“一对多”等关联关系中可以双方维护关系是因为它采取的是更新外键操作。 总结:在“一对多”中,维护关系表现为更新外键,而“多对多”,维护关系表现为在“中间表”中增减记录。
下面我们修改Department.hbm.xml文件,在<set>元素下增加“inverse="true"”属性后,再来执行“OneToManyTest”,可以明显感受到“一”放弃了维护关系。
注意:inverse只出现在集合类型的标签中,但不能在list等有序集合中进行配置。
分享到:
相关推荐
Matlab仿真研究:级联H桥储能变流器在下垂控制下的离网运行及VSG控制平滑并网实现,MATLAB仿真研究:级联H桥储能变流器离网与并网运行模式下的VSG控制策略与预同步平滑并网技术,matlab仿真,级联h桥储能变流器,下垂...
"谷歌:级联语言模型是通用推理系统的未来.pdf" 本文总结了谷歌Research团队关于级联语言模型(Language Model Cascades)在通用推理系统中的应用前景。级联语言模型是指通过多个语言模型的级联来实现复杂的多步...
高频阻抗模型:级联H桥SVG的深入解析,级联H桥SVG高频阻抗模型的研究与应用,级联H桥svg高频阻抗模型 ,级联H桥; SVG; 高频阻抗; 模型,高频阻抗模型:级联H桥SVG研究
在Hibernate中,级联操作(Cascading Operations)是一种高级特性,它使得对象之间的关联关系在数据库层面得以同步更新。当我们对一个实体对象进行操作时,可以设置级联属性,让这些操作自动传播到与之相关联的其他...
JQuery实战第五讲:级联下拉框效果,如果用在《MVC中更加合适
"MATLAB仿真研究:级联H桥储能变流器离网与并网模式下的VSG控制技术,实现预同步平滑并网",matlab仿真,级联h桥储能变流器,下垂控制离网运行仿真,vsg控制,同步发电机控制,离网模式并网模式下均可以运行,可以...
Simulink仿真下的级联光伏发电MPPT追踪并网技术:探究MATLAB Simulink平台上的三个独立光伏发电系统级联并网技术参考文献讲解,Simulink仿真:级联光伏发电MPPT追踪并网 关键词: 参考文献:具备同步电机特性的级联型...
Simulink仿真:级联光伏发电MPPT追踪并网 关键词: 参考文献:具备同步电机特性的级联型光伏发电系统+视频讲解 仿真平台:MATLAB Simulink 主要内容:3个单独光伏发电MPPT级联并网
级联的操作有级联更新,级联删除。 二、级联相应的操作 在启用一个级联更新选项后,就可在存在相匹配的外键值的前提下更改一个主键值。系统会相应地更新所有匹配的外键值。如果在表A中将姓名为王五的记录改为李四,...
Hibernate框架中,CascadeType是hibernate的重要属性之一,它控制着实体之间的级联操作。CascadeType是hibernate中的枚举类型,定义了多种级联操作,包括REFRESH、PERSIST、REMOVE、MERGE、ALL等。 CascadeType....
四旋翼无人机动力学模型仿真:级联PID控制器与姿态位置控制研究报告,四旋翼无人机位置姿态控制 四旋翼无人机仿真 四旋翼无人机动力学模型 包含力方程组与力矩方程组 级联PID控制器 内环姿态环,外环位置环。 有...
"级联H桥SVG高频阻抗模型研究与应用",级联H桥svg高频阻抗模型 ,级联H桥; SVG; 高频阻抗; 模型;,高频阻抗模型:级联H桥SVG研究
标题中的“谷歌:级联语言模型是通用推理系统的未来”暗示了本次讨论的重点——谷歌公司对级联语言模型(Cascade Language Models)的研究及其在构建通用推理系统中的前景。这一概念与人工智能、自然语言处理(NLP)...
级联H桥技术:载波层叠实现2级联度,输出5电平的高效电力转换,级联H桥。 采用载波层叠,级联度为2,输出电平数为5。 ,核心关键词:级联H桥; 载波层叠; 级联度为2; 输出电平数为5。,"级联H桥:载波层叠技术下的2级...
级联H桥型APF与有源电力滤波器的结合:级联h桥型Statcom技术解析,级联H桥型APF,级联h桥,级联h桥型statcom,级联h桥型有源电力滤波器,有源电力滤波器 ,级联H桥型APF; 级联h桥; 级联h桥型statcom; 有源电力滤波器,...
第七章_Hibernate_-_级联策略 第七章
Matlab仿真研究:级联H桥储能变流器及其相内相间SOC均衡技术,应用单极倍频载波移相调制与零序电压注入法实现2MW 10kV等级14级联高压直挂式储能变流器,Matlab仿真研究:高压直挂式储能变流器级联H桥技术及其SOC均衡...
【标题】:Hibernate_范型_级联 在Java编程中,Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发人员将数据库操作转换为面向对象的方式,从而简化了数据库应用的开发。范型(Generics)是Java 5引入的一...
在这个“动物保护:Git,HTML和CSS编程入门练习:级联”的项目中,我们将学习如何使用Git进行版本控制,以及如何运用HTML和CSS来创建一个关于动物保护的网站。这个项目特别强调了CSS的级联特性,这对于理解样式是...
电力电子变压器技术:级联H桥多电平整流级与三相逆变器输出控制研究,电力电子变压器。 整流级采用级联H桥多电平拓扑,由三个H桥模块级联,将工频交流转为直流,级联多电平可以减小开关器件的电压应力和开关频率。 ...