- 浏览: 140306 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
aa87963014:
很好,但是update/insert 是否加锁 。加锁对sel ...
数据库锁 -
RobustTm:
我的这种做法也可以添加A和B
但是换成更新就有问题
hibernate入门(十一):级联操作inversin属性 -
RobustTm:
这位仁兄可以提供一对多双向关联完整的代码不?
我碰到了问题,采 ...
hibernate入门(十一):级联操作inversin属性 -
cfeers:
markxing 写道谢谢分享。。。
不客气,呵呵。
struts2.0 struts.xml配置文件详解 -
markxing:
谢谢分享。。。
struts2.0 struts.xml配置文件详解
九、关联关系中的高级应用
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();
- }
- }
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等有序集合中进行配置。
评论
但是换成更新就有问题
我碰到了问题,采用你里面的做法也不行啊。
我大致要做的流程是:
更新一个表的信息 A表,B表中有个字段是A的主键,A与B外键关联
页面中有A表和B表的信息
A表中的id(主键)确定,其他信息需要更新,主键不是自增的,是String类型,设置的
而B表是添加插入的操作。
A.java
public class A{
private String a_id;
private String title;
private String content;
Set<B> b;
}
B.java
public class B{
private String b_id;
private A a;
private String content;
}
xml
B
<many-to-one name="a" column="a_id" class="com.bean.A"/>
A
<set name="b" lazy="true" table="B"
order-by="id desc" inverse="true" cascade="save-update">
<key column="a_id" />
<one-to-many class="com.bean.B" />
</set>
具体的更新大致是
A a = aDAOImpl.getA(a_id);
a.setTitle(title);
a.setContent(content);
B b = new B();
b.setId(b_id);
b.setA(a);
b.setContent(content);
aDAOImpl.update(a);
bDAOImpl.add(b);
更新不成功,操作相当慢,最后数据库连接都断了
忘仁兄指导
发表评论
-
hibernate.cfg.xml文件详解(annotation 配置)
2010-08-26 15:57 1561一、 环境搭建和基本映 ... -
hibernate.cfg.xml文件详解
2010-08-26 15:56 742<?xml version='1.0' encoding ... -
hiberante入门(十七):简要总结及源码文档
2010-08-26 11:28 693十三、总结: 1.主配置与实体(映射)配置: 关于这些配置 ... -
hiberante入门(十六):一些细节理论
2010-08-26 11:26 746十二、一些细节问题分 ... -
hiberante入门(十五):事务相关-悲观乐观锁
2010-08-26 11:25 11641.事务引发的三层架构MV ... -
hiberante入门(十四):缓存2
2010-08-26 11:24 426>>步骤四、测试二 ... -
hiberante入门(十四):缓存1
2010-08-26 11:10 7611.模拟缓存并简要说明缓存实现原理 在myhibernate ... -
hiberante入门(十三):懒加载
2010-08-26 11:07 9274.懒加载: 在前面我们已经对懒加载有所提及,现在再借助一个 ... -
hiberante入门(十二):继承关系2
2010-08-26 11:03 963上接hiberante入门(十二 ... -
hiberante入门(十二):继承关系1
2010-08-26 11:01 8253.继承关系: 在前面的部门员工实例中,我们设定的员工只是普 ... -
hiberante入门(十):其它集合类型
2010-08-26 10:53 762八、其它集合类型 说明:在前面我们已经使用过set集合类型, ... -
hibernate入门(九):组件关系映射
2010-08-26 10:51 7745.组件关系映射: 典型实例:每个人有不同的名字,或者多个人 ... -
hibernate入门(八):多对多
2010-08-26 10:48 6454.多对多关系映射: 典型实例:一个学生可以有多个老师 ... -
hibernate入门(七):一对一
2010-08-26 10:42 7223.一对一关系映射: 典型的实例:一个人有一个身份证,而一个 ... -
hibernate入门(六):一对多
2010-08-26 10:36 6892.一对多关系映射: 上面提到的多个员工对应于一个部门,是多 ... -
hibernate入门(五):多对一
2010-08-26 10:32 6431.多对一关系映射: 一个部门有可以有多个员工,而一个员工只 ... -
hibernate入门(四):HQL QBC初步
2010-08-26 10:22 909四 完善工具类及HQL QBC ... -
hibernate入门(三):对象的三种状态
2010-08-26 10:20 687三 Session中的主要方法 ... -
hibernate入门(二):优化代码
2010-08-26 10:17 765二 优化代码 1.为会么要优化 在前面我们已经知道,获取S ... -
hibernate入门(一):第一个应用实例
2010-08-26 10:15 877一 第一个应用实例 1.搭建环境:新建一个名为Hiberna ...
相关推荐
"谷歌:级联语言模型是通用推理系统的未来.pdf" 本文总结了谷歌Research团队关于级联语言模型(Language Model Cascades)在通用推理系统中的应用前景。级联语言模型是指通过多个语言模型的级联来实现复杂的多步...
在Hibernate中,级联操作(Cascading Operations)是一种高级特性,它使得对象之间的关联关系在数据库层面得以同步更新。当我们对一个实体对象进行操作时,可以设置级联属性,让这些操作自动传播到与之相关联的其他...
JQuery实战第五讲:级联下拉框效果,如果用在《MVC中更加合适
级联的操作有级联更新,级联删除。 二、级联相应的操作 在启用一个级联更新选项后,就可在存在相匹配的外键值的前提下更改一个主键值。系统会相应地更新所有匹配的外键值。如果在表A中将姓名为王五的记录改为李四,...
Hibernate框架中,CascadeType是hibernate的重要属性之一,它控制着实体之间的级联操作。CascadeType是hibernate中的枚举类型,定义了多种级联操作,包括REFRESH、PERSIST、REMOVE、MERGE、ALL等。 CascadeType....
标题中的“谷歌:级联语言模型是通用推理系统的未来”暗示了本次讨论的重点——谷歌公司对级联语言模型(Cascade Language Models)的研究及其在构建通用推理系统中的前景。这一概念与人工智能、自然语言处理(NLP)...
第七章_Hibernate_-_级联策略 第七章
【标题】:Hibernate_范型_级联 在Java编程中,Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发人员将数据库操作转换为面向对象的方式,从而简化了数据库应用的开发。范型(Generics)是Java 5引入的一...
在这个“动物保护:Git,HTML和CSS编程入门练习:级联”的项目中,我们将学习如何使用Git进行版本控制,以及如何运用HTML和CSS来创建一个关于动物保护的网站。这个项目特别强调了CSS的级联特性,这对于理解样式是...
本教程将深入探讨JPA中的一对多双向关联及级联操作,这对于理解和使用JPA进行复杂数据模型管理至关重要。 首先,我们来理解一下一对多关联。在数据库设计中,一对多关联是指一个实体(表)可以与多个其他实体相关联...
### Hibernate基础之关联映射与级联操作 #### 第一部分:主键生成策略与对象状态管理 ##### 主键生成策略 在使用Hibernate框架时,合理的主键生成策略能够极大地简化开发工作并提升应用性能。Hibernate提供了多种...
2. **级联操作类型**:Hibernate支持多种级联类型,包括`SAVE_UPDATE`、`PERSIST`、`MERGE`、`REFRESH`、`DELETE`和`ALL`。每种类型对应着对关联对象的不同操作行为。 3. **配置级联**:在Hibernate的映射文件(XML...
4. **懒加载与级联**:如果关联属性是懒加载的,那么在没有加载该属性的情况下进行级联操作可能会抛出异常。因此,需要根据实际需求合理选择加载策略。 5. **最佳实践**:避免在不需要的地方使用级联操作,以减少...
在Java持久化框架Hibernate中,级联操作是处理对象关系映射(ORM)时非常重要的一个特性。级联操作允许我们在对一个实体进行操作时,自动地影响与之相关的其他实体,无需显式地处理这些关联。在这个" Hibernate级联...
在 Hibernate 中,级联操作(Cascade)和反向属性(Inverse)是管理对象关系的重要概念,特别是在处理一对多(One-to-Many)或多对一(Many-to-One)关系时。 **级联操作(Cascade)** 级联操作定义了当主对象被...
在Hibernate中,级联操作可以通过`cascade`属性进行配置。主要有以下几种级联类型: 1. `save-update`:当保存或更新父实体时,会自动保存或更新所有关联的子实体。 2. `merge`:在调用`session.merge()`时,不仅...
MISO系统的智能反射面信道估计:级联信道与压缩感知前言系统模型信道模型级联信道信道估计 前言 原文:《Compressed Channel Estimation and Joint Beamforming for Intelligent Reflecting Surface-Assisted ...
**初学Hibernate,Hibernate入门** ...随着对Hibernate的深入学习,你会发现它还支持更高级的功能,如级联操作、多对一、一对多等复杂关系映射、缓存机制、延迟加载等,这些都将极大地提升你的开发效率。