- 浏览: 887397 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (687)
- java (127)
- servlet (38)
- struts (16)
- spring (22)
- hibernate (40)
- javascript (58)
- jquery (18)
- tomcat (51)
- 设计模式 (6)
- EJB (13)
- jsp (3)
- oracle (29)
- RUP (2)
- ajax (3)
- java内存管理 (4)
- java线程 (12)
- socket (13)
- path (5)
- XML (10)
- swing (2)
- UML (1)
- JBPM (2)
- 开发笔记 (45)
- Note参考 (15)
- JAXB (4)
- Quartz (2)
- 乱码 (2)
- CSS (2)
- Exception (4)
- Tools (7)
- sqlserver (3)
- DWR (7)
- Struts2 (47)
- WebService (2)
- 问题解决收藏 (7)
- JBOSS (7)
- cache (10)
- easyUI (19)
- jQuery Plugin (11)
- FreeMarker (6)
- Eclipse (2)
- Compass (2)
- JPA (1)
- WebLogic (1)
- powerdesigner (1)
- mybatis (1)
最新评论
-
bugyun:
受教了,谢谢
java 正则表达式 过滤html标签 -
xiongxingxing_123:
学习了,感谢了
java 正则表达式 过滤html标签 -
wanmeinange:
那如果无状态的。对同一个任务并发控制怎么做?比如继承Quart ...
quartz中参数misfireThreshold的详解 -
fanjieshanghai:
...
XPath 元素及属性查找 -
tianhandigeng:
还是没明白
quartz中参数misfireThreshold的详解
这两个属性都用于一多对或者多对多的关系中。而inverse特别是用于双向关系,在单向关系中我们并不需要。
Cascade代表是否执行级联操作,Inverse代表是否由己方维护关系。
Cascade:
Cascade属性的可能值有
all: 所有情况下均进行关联操作,即save-update和delete。
none: 所有情况下均不进行关联操作。这是默认值。
save-update: 在执行save/update/saveOrUpdate时进行关联操作。
delete: 在执行delete 时进行关联操作。
all-delete-orphan: 当一个节点在对象图中成为孤儿节点时,删除该节点。比如在一个一对多的关系中,Student包含多个book,当在对象关系中删除一个book时,此book即成为孤儿节点。
Inverse:
Inverse属性的可能值是true或者false,默认为false:
false代表由己方来维护关系,true代表由对方来维护关系。在一个关系中,只能由一方来维护关系,否则会出问题(解疑中会讲到);同时也必须由一方来维护关系,否则会出现双方互相推卸责任,谁也不管。
一多对的例子:
有两个类,Father和Child,是一对多的关系。下面这段hbm配置是从Father.hbm.xml中摘取的。
<set name="children" lazy="true" cascade="all" inverse="true"> <key column="fatherid"/> <one-to-many class="my.home.Child"/> </set>
我们知道cascade和inverse的值对会有四种组合的可能(在此仅先假定cascade值为none或all)。
有如下一段代码:
- FatherDao fatherDao = new FatherDao();
- Father father = new Father("David");
- Child child1 = new Child("David Junior One");
- Child child2 = new Child("David Junior Two");
- father.add(child1);
- father.add(child2);
- fatherDao.save(father);
- 1. 如果cascade="all"且inverse="false"时:
- 此时可以看到log里面:
- // 执行对father的插入
- Hibernate: insert into father (name) values (?)
- // cascade = 'all',所以进行级联操作
- Hibernate: insert into child (name, fatherid) values (?, ?)
- Hibernate: insert into child (name, fatherid) values (?, ?)
- // inverse = 'false',由father来维护关系(可以看到这些操作是多余的)
- Hibernate: update child set fatherid =? where ID=?
- Hibernate: update child set fatherid =? where ID=?
- 2. 如果cascade = "none" 且 inverse = "false":
- // 执行对father的插入
- Hibernate: insert into father (name) values (?)
- // inverse='false',所以更新关系
- Hibernate: update child set fatherid =? where ID=?
- // 但由于cascade='none',child并未插入数据库,导致如下exception
- org.springframework.dao.InvalidDataAccessApiUsageException: object references an unsaved transient instance
- 3. 如果cascade = "all" 且 inverse = "true"
- // 执行对father的插入
- Hibernate: insert into father (name) values (?)
- // cascade='all',执行对child的插入
- Hibernate: insert into child (name, fatherid) values (?, ?)
- Hibernate: insert into child (name, fatherid) values (?, ?)
- // 但由于inverse='true',所以未有对关系的维护。但由于一对多的关系中,关系本身在“多”方的表中。所以,无需更新
- 关系。
- 4. 如果cascade = "none" 且 inverse = "true"
- // 只执行对father的插入
- Hibernate: insert into father (name) values (?)
- 可以看到,对于一对多关系,关系应由“多”方来维护(指定“一”方的inverse为true),并且应在“一”方指定相应的级联操作。
FatherDao fatherDao = new FatherDao(); Father father = new Father("David"); Child child1 = new Child("David Junior One"); Child child2 = new Child("David Junior Two"); father.add(child1); father.add(child2); fatherDao.save(father); 1. 如果cascade="all"且inverse="false"时: 此时可以看到log里面: // 执行对father的插入 Hibernate: insert into father (name) values (?) // cascade = 'all',所以进行级联操作 Hibernate: insert into child (name, fatherid) values (?, ?) Hibernate: insert into child (name, fatherid) values (?, ?) // inverse = 'false',由father来维护关系(可以看到这些操作是多余的) Hibernate: update child set fatherid =? where ID=? Hibernate: update child set fatherid =? where ID=? 2. 如果cascade = "none" 且 inverse = "false": // 执行对father的插入 Hibernate: insert into father (name) values (?) // inverse='false',所以更新关系 Hibernate: update child set fatherid =? where ID=? // 但由于cascade='none',child并未插入数据库,导致如下exception org.springframework.dao.InvalidDataAccessApiUsageException: object references an unsaved transient instance 3. 如果cascade = "all" 且 inverse = "true" // 执行对father的插入 Hibernate: insert into father (name) values (?) // cascade='all',执行对child的插入 Hibernate: insert into child (name, fatherid) values (?, ?) Hibernate: insert into child (name, fatherid) values (?, ?) // 但由于inverse='true',所以未有对关系的维护。但由于一对多的关系中,关系本身在“多”方的表中。所以,无需更新 关系。 4. 如果cascade = "none" 且 inverse = "true" // 只执行对father的插入 Hibernate: insert into father (name) values (?) 可以看到,对于一对多关系,关系应由“多”方来维护(指定“一”方的inverse为true),并且应在“一”方指定相应的级联操作。
多对多:
在多对多关系中,inverse可以为任何一方,没有什么区别。
解疑:
为什么在多对多中不能由双方都来维护关系了:因为这样会导致重复更新中间表的可能,报出重复值的错误。
那么如何在多对多的双向关联中使双方都能维护关系:最好让控制关系的那方来更新关系,如果想让另一方也来维护关系,那么只有在操作这一方的数据时“显式”更新中间表了吧。
注意:
同时注意在双向关联中,对象之间的关联跟上面提及的关系表维护没有关系。一个是对象/java层面的,一个是hibernate数据库层面的。如果你想在更新一方时,也更新另一方的对象集合,请看下面这段代码:
这是Person类中的一段代码,Person和Event是多对多的双向关联关系,他们在对方类中的集合分别为participants和events。关系表由Person维护,所以对象关系的维护也在Person类中,而不是Event类中。
- public void addToEvent(Event event) {
- this.getEvents().add(event);
- event.getParticipants().add(this);
- }
- public void removeFromEvent(Event event) {
- this.getEvents().remove(event);
- event.getParticipants().remove(this);
- }
http://zfsn.iteye.com/blog/512096
发表评论
-
Criteria查询,DetachedCriteria离线查询 --做综合查询
2011-09-06 00:25 1597通过Session得到Criteria类的对象 Ja ... -
Hibernate批量操作(JDBC批量操作)
2011-09-06 00:24 1293部分内容转自 :http://ga ... -
Hibernate懒加载深入分析
2011-09-06 00:19 1324懒加载可以提高性能吗? 不可以简单的说"能" ... -
getSesson currentSession
2011-09-06 00:15 10001 getCurrentSession创建的session会和 ... -
Hibernate 操作Blob Clob
2011-09-05 23:46 1068Photo.java Java代码 i ... -
Hibernate建表错误,Could not determine type for: java.util.List
2011-04-04 22:19 1642今天遇到 Could not determine type f ... -
Hibernate的fetch="join"和fetch="select"
2011-03-24 14:16 969fetch参数指定了关联对 ... -
Hibernate的Criteria用法总结
2011-03-23 10:53 777最近在项目中使用 Struts 和 Hibernate 进行开 ... -
第29讲--为Spring集成的Hibernate配置二级缓存
2011-03-10 23:16 1101合理的使用缓存策略,往往在web开发中提高性能起到关键作用。 ... -
hibernate抓取策略
2011-02-12 13:23 820Hibernate最让人头大的就是对集合的加载形式。书看了N次 ... -
Hibernate笔记:HQL查询总结(一)——简单属性查询和实体对象查询
2011-02-01 23:38 3494本文一部分转自kuangbaoxu的博文hibernate-- ... -
Hibernate笔记:HQL查询总结(二)——条件查询
2011-02-01 23:35 1507条件查询 1.拼字符串 where条件后面,可以用字 ... -
Hibernate属性延迟加载
2011-02-01 21:28 1012Hibernate3开始增加了通过property节点的la ... -
batch_size 和 fetch_size作用
2010-12-01 21:37 1280hibernate抓取策略,,batch-szie在< ... -
hibernate中SQLQuery的addEntity();方法
2010-10-20 10:48 2770如果使用原生sql语句进行query查询时,hibernate ... -
Hibernate的evict方法错误总结
2010-10-14 10:08 1209摘自百度知道:http://zhi ... -
hibernate中get方法和load方法的区别
2010-10-14 09:57 799键字: hibernate get load 区 ... -
Hibernate: 设A引用了B,则删A后可能要evict(A.getB())
2010-10-14 09:56 1001Hibernate: 设A引用了B,如果要先取A删A再取B删B ... -
Hibernate的flush()和evict()总结
2010-10-14 09:53 1324关键字: hibernate flush() evict() ... -
flush,commit,evict
2010-10-14 09:52 921Flush()后只是将Hibernate缓存中的数据提交到数据 ...
相关推荐
在 Hibernate 框架中,`cascade` 和 `inverse` 是两个重要的概念,它们主要用于管理对象之间的持久化关系,特别是涉及到一对一(one-to-one)、一对多(one-to-many)和多对多(many-to-many)关系时。这两个属性都...
Hibernate中cascade与inverse属性详解
在Java的持久化框架Hibernate中,级联操作(Cascade)和反转(Inverse)是两个重要的概念,它们主要用于管理对象关系模型中的关联关系。在一对多的关系中,这些特性可以帮助简化数据操作,提高代码的可读性和维护性...
### Hibernate Inverse 和 Cascade 的详细讲解 #### 一、引言 在ORM(Object-Relational Mapping)领域,Hibernate作为一款流行的Java持久层框架,它提供了丰富的API和配置选项来帮助开发者实现对象与数据库表之间...
Hibernate中Inverse和Cascade的区别.html
在探讨Hibernate框架中的级联操作(cascade)与控制权反转(inverse)之前,我们需要先对Hibernate有一个基本的理解。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用提供了一种将对象模型映射到...
本篇将深入讲解“cascade”和“inverse”这两个重要的概念,以及它们在实际应用中的作用。 首先,让我们理解一下“关联映射”。在Hibernate中,关联映射允许我们将Java对象与数据库表的记录进行关联。例如,一个...
在IT领域,"inverse"和"cascade"是两个常见的概念,尤其在数据库设计、软件工程以及数据处理中。这两个术语通常与关系型数据库中的外键约束、对象关系映射(ORM)工具,以及某些编程框架的特性相关。下面将详细阐述这...
总结起来,`cascade`和`inverse`是Hibernate中用于管理对象关联关系的重要属性,它们共同确保了数据的一致性和操作的便捷性。在实际应用中,需要根据业务逻辑和性能需求,合理设置这两个属性,以达到最佳的数据库...
`inverse`和`cascade`属性是Hibernate集合映射中非常重要的概念,它们帮助开发者更灵活地控制实体之间的关系以及操作的级联行为。合理地使用这两个属性,不仅可以简化代码,还能提高程序的性能和健壮性。然而,不当...
### Hibernate中的Cascade选项详解 #### 一、概述 在Hibernate框架中,cascade选项提供了一种管理实体间关联的便捷方式,使得对一个实体的操作能够自动地应用到与之相关的其他实体上。这对于处理复杂的数据库关系...
`inverse`属性是Hibernate中用于控制关联维护权的重要参数,它的主要作用在于确定关联关系的更新和删除操作由哪一方负责。默认情况下,关联的维护权在"多"端,即子实体,这意味着当子实体发生变化时,如增加、删除或...
hibernate中一对一,一对多,多对多关系的配置,延迟加载,cascade,inverse hibernate查询方式概述,HQL查询,QBC查询,分页,结果集封装方式 ,高级查询 查询的优化,一级缓存,二级缓存,批量查询,注解方式
描述提到“使用cascade和inverse优化区和街道关联关系”,这意味着我们将深入理解Hibernate的cascade和inverse属性,以及它们在双向一对多关联关系中的应用。 Hibernate是Java领域中广泛使用的对象关系映射(ORM)...
在Hibernate中,`cascade`和`inverse`是两个重要的概念,它们涉及到对象之间的关系管理和数据持久化。 **1. Hibernate Cascade** `cascade`属性主要用于控制对象间的级联操作。当在主对象上执行保存、更新、删除等...
根据提供的文件信息,我们可以深入探讨Hibernate框架中的几个关键概念,特别是`fetch`, `lazy`, `cascade`, 和 `inverse`关键字的使用与理解。这四个概念在处理对象关系映射(ORM)时非常重要,尤其是在Java环境下...
理解并正确使用Hibernate的`cascade`和`inverse`属性对于优化数据操作和避免数据一致性问题至关重要。在实际开发中,应根据业务逻辑和数据模型谨慎设定这些属性,以确保数据操作的正确性和高效性。
在Hibernate这个强大的对象关系映射(ORM)框架中,`inverse`属性是一个非常重要的概念,它主要用于管理关联关系的维护责任。在这个例子中,我们将会深入理解`inverse`属性的作用,并通过一个简单的测试案例——`...