- 浏览: 207992 次
- 性别:
- 来自: 厦门
最新评论
-
leihuoA:
请问一下这是什么意思呀
错误提示:Package Reference constraint name maximum length is limited to 30 character -
venus224:
andyiouv 写道我们都在追忆05那年的利物浦 今年真是惨 ...
myeclipse中使用svn -
andyiouv:
我们都在追忆05那年的利物浦 今年真是惨不忍睹 包子伤快好
myeclipse中使用svn -
nju33377678:
还是不行!这方法没用!
运行的时候报关于log4j的警告!解决方案 -
zhanght327:
configuration 文件夹有 N 个 是都要删除吗?
...
an error has occurred.See error log for more deta
首先引用另一个blog的说法:
1.cascade="..."?
cascade属性并不是多对多关系一定要用的,有了它只是让我们在插入或删除对像时更方便一些,只要在cascade的源头上插入或是删除,所有cascade的关系就会被自己动的插入或是删除。便是为了能正确的cascade,unsaved- value是个很重要的属性。
Hibernate通过这个属性来判断一个对象应该save还是update,如果这个对象的id是 unsaved-value的话,那说明这个对象不是persistence object要save(insert);如果id是非unsaved-value的话,那说明这个对象是persistence object(数据库中已存在),只要update就行了。saveOrUpdate方法用的也是这个机制。
2.inverse="ture"?
inverse 属性默认是false的,就是说关系的两端都来维护关系。这个意思就是说,如有一个Student, Teacher和TeacherStudent表,Student和Teacher是多对多对多关系,这个关系由TeacherStudent这个表来表现。那么什么时候插入或删除TeacherStudent表中的记录来维护关系呢?在用hibernate时,我们不会显示的对 TeacherStudent表做操作。
对TeacherStudent的操作是hibernate帮我们做的。hibernate就是看 hbm文件中指定的是"谁"维护关系,那个在插入或删除"谁"时,就会处发对关系表的操作。前提是"谁"这个对象已经知道这个关系了,就是说关系另一头的对象已经set或是add到"谁"这个对象里来了。前面说过inverse默认是false,就是关系的两端都维护关系,对其中任一个操作都会处发对表系表的操作。当在关系的一头,如Student中的bag或set中用了inverse="true"时,那就代表关系是由另一关维护的(Teacher)。就是说当这插入Student时,不会操作TeacherStudent表,即使Student已经知道了关系。只有当 Teacher插入或删除时才会处发对关系表的操作。
所以,当关系的两头都用inverse="true"是不对的,就会导致任何操作都不处发对关系表的操作。当两端都是inverse="false"或是default值是,在代码对关系显示的维护也是不对的,会导致在关系表中插入两次关系。在一对多关系中inverse就更有意义了。在多对多中,在哪端inverse="true"效果差不多(在效率上)。但是在一对多中,如果要一方维护关系,就会使在插入或是删除"一"方时去update"多"方的每一个与这个"一"的对象有关系的对象。
而如果让"多"方面维护关系时就不会有update操作,因为关系就是在多方的对象中的,直指插入或是删除多方对象就行了。当然这时也要遍历"多"方的每一个对象显示的操作修关系的变化体现到DB中。不管怎样说,还是让"多"方维护关系更直观一些。
3.cascade和inverse有什么区别?
可以这样理解,cascade定义的是关系两端对象到对象的级联关系;而inverse定义的是关系和对象的级联关系。在一对多映射中,一的一方要设<set (inverse="false") casecade="save-update" />,多的一方要设<many-to-one inverse=true (casecade="none") />
Wenic的blog:Wenic的blog:http://www.matrix.org.cn/blog/wenic705
------------------------------------
这个是我做的用例。测试cascade和inverse.分析结果以及具体hibernate sql都在,比较容易看明白。
希望不是很明白的看看,加深印象。
小弟学识浅薄,如果有不对的地方,请指出来,谢谢!~
测试环境:Eclispe,用断点测试。
数据库是SQLServer2000.
Area.hbm.xml
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"; ><hibernate-mapping><class name="net.villion.model.test.Area" table="r_area"><id column="ID" type="long" name = "id" length="10" unsaved-value="null"> <generator class = "native"/></id><property column="name" name="name" type="string"/><many-to-one name="state" class="net.villion.model.test.State" cascade="all"> <column name="stateid" index="index_area_state"/></many-to-one></class></hibernate-mapping>State.hbm.xml<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"; ><hibernate-mapping><class name="net.villion.model.test.State" table="r_state"><id column="ID" type="long" name = "id" length="10" unsaved-value="null"> <generator class = "native"/></id><property column="name" name="name" type="string"/><set name="areas" lazy="true" cascade="all" inverse="false"> <key column="stateid"/> <one-to-many class="net.villion.model.test.Area"/></set></class></hibernate-mapping>
我们主要看inverse,cascade级联的设置。
当State.hbm.xml inverse = "false" cascade = "all"
//添加//code StateDAO sdao =(StateDAO) ctx.getBean("stateDAO");AreaDAO adao = (AreaDAO)ctx.getBean("areaDAO"); Area a3 = new Area();a3.setName("NewYork");Area a4 = new Area();a4.setName("Frolida");State s2 = new State();s2.setName("America"); Set set = new HashSet();set.add(a3);set.add(a4);s2.setAreas(set);sdao.saveObject(s2); //sql:Hibernate: insert into r_state (name) values (?)Hibernate: insert into r_area (name, stateid) values (?, ?)Hibernate: insert into r_area (name, stateid) values (?, ?)Hibernate: update r_area set stateid=? where ID=?Hibernate: update r_area set stateid=? where ID=?
//当State.hbm.xml inverse = "false" cascade = "none"(注意我们操作的是State)
//sql: insert into r_state (name) values (?)
Hibernate: update r_area set stateid=? where ID=?
org.springframework.dao.InvalidDataAccessApiUsageException: object references an unsaved transient instance
这时候更新area的时候由于area,并未级联插入所以找不到报错。所以这样设置还是会更新Area的stateid
接着上面的说,我们要看当设置改变时的sql变化。
上面就说明了cascade="all" 时候能级联插入,而none的时候只是维持两者之间的关系(inverse="false")。
上面两种情况的删除又不一样了,但是一个道理
cascade="all"时,两个表数据都级联删除了。
而cascade="none"时
Hibernate: update r_area set stateid=null where stateid=?
Hibernate: delete from r_state where ID=?说明它只是维持关系。
而当上面的inverse ="true"时 cascade="none"时
sql: insert into r_state (name) values (?)
只插入一条State,不会插入Area表了。
删除时
Hibernate: delete from r_state where ID=?
org.springframework.dao.DataIntegrityViolationException: (Hibernate operation): data integrity violated by SQL ''; nested exception is com.jnetdirect.jsql.u: DELETE 语句与 COLUMN REFERENCE 约束 'FKC7F1003A8EEBF16C' 冲突。该冲突发生于数据库 'hd',表 'r_area', column 'stateid'。
com.jnetdirect.jsql.u: DELETE 语句与 COLUMN REFERENCE 约束 'FKC7F1003A8EEBF16C' 冲突
由于没有维护数据库关系,引起外键冲突报错。
inverse ="true"时 cascade="all"时
sql:
Hibernate: insert into r_state (name) values (?)
Hibernate: insert into r_area (name, stateid) values (?, ?)
Hibernate: insert into r_area (name, stateid) values (?, ?)
全部级联插入,但r_area表中stateid是null。
删除时。
Hibernate: delete from r_area where ID=?
Hibernate: delete from r_area where ID=?
Hibernate: delete from r_state where ID=?
级联删除。
所以总结一下 ,cascade 是级联的程度,而inverse="false|ture" 是指是否维持两个实体的关系。(两个表的外键)。
水平有限,请各位看客口下留情。
如果耽误了你的宝贵,我在这里道歉了。 :(
1.cascade="..."?
cascade属性并不是多对多关系一定要用的,有了它只是让我们在插入或删除对像时更方便一些,只要在cascade的源头上插入或是删除,所有cascade的关系就会被自己动的插入或是删除。便是为了能正确的cascade,unsaved- value是个很重要的属性。
Hibernate通过这个属性来判断一个对象应该save还是update,如果这个对象的id是 unsaved-value的话,那说明这个对象不是persistence object要save(insert);如果id是非unsaved-value的话,那说明这个对象是persistence object(数据库中已存在),只要update就行了。saveOrUpdate方法用的也是这个机制。
2.inverse="ture"?
inverse 属性默认是false的,就是说关系的两端都来维护关系。这个意思就是说,如有一个Student, Teacher和TeacherStudent表,Student和Teacher是多对多对多关系,这个关系由TeacherStudent这个表来表现。那么什么时候插入或删除TeacherStudent表中的记录来维护关系呢?在用hibernate时,我们不会显示的对 TeacherStudent表做操作。
对TeacherStudent的操作是hibernate帮我们做的。hibernate就是看 hbm文件中指定的是"谁"维护关系,那个在插入或删除"谁"时,就会处发对关系表的操作。前提是"谁"这个对象已经知道这个关系了,就是说关系另一头的对象已经set或是add到"谁"这个对象里来了。前面说过inverse默认是false,就是关系的两端都维护关系,对其中任一个操作都会处发对表系表的操作。当在关系的一头,如Student中的bag或set中用了inverse="true"时,那就代表关系是由另一关维护的(Teacher)。就是说当这插入Student时,不会操作TeacherStudent表,即使Student已经知道了关系。只有当 Teacher插入或删除时才会处发对关系表的操作。
所以,当关系的两头都用inverse="true"是不对的,就会导致任何操作都不处发对关系表的操作。当两端都是inverse="false"或是default值是,在代码对关系显示的维护也是不对的,会导致在关系表中插入两次关系。在一对多关系中inverse就更有意义了。在多对多中,在哪端inverse="true"效果差不多(在效率上)。但是在一对多中,如果要一方维护关系,就会使在插入或是删除"一"方时去update"多"方的每一个与这个"一"的对象有关系的对象。
而如果让"多"方面维护关系时就不会有update操作,因为关系就是在多方的对象中的,直指插入或是删除多方对象就行了。当然这时也要遍历"多"方的每一个对象显示的操作修关系的变化体现到DB中。不管怎样说,还是让"多"方维护关系更直观一些。
3.cascade和inverse有什么区别?
可以这样理解,cascade定义的是关系两端对象到对象的级联关系;而inverse定义的是关系和对象的级联关系。在一对多映射中,一的一方要设<set (inverse="false") casecade="save-update" />,多的一方要设<many-to-one inverse=true (casecade="none") />
Wenic的blog:Wenic的blog:http://www.matrix.org.cn/blog/wenic705
------------------------------------
这个是我做的用例。测试cascade和inverse.分析结果以及具体hibernate sql都在,比较容易看明白。
希望不是很明白的看看,加深印象。
小弟学识浅薄,如果有不对的地方,请指出来,谢谢!~
测试环境:Eclispe,用断点测试。
数据库是SQLServer2000.
Area.hbm.xml
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"; ><hibernate-mapping><class name="net.villion.model.test.Area" table="r_area"><id column="ID" type="long" name = "id" length="10" unsaved-value="null"> <generator class = "native"/></id><property column="name" name="name" type="string"/><many-to-one name="state" class="net.villion.model.test.State" cascade="all"> <column name="stateid" index="index_area_state"/></many-to-one></class></hibernate-mapping>State.hbm.xml<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"; ><hibernate-mapping><class name="net.villion.model.test.State" table="r_state"><id column="ID" type="long" name = "id" length="10" unsaved-value="null"> <generator class = "native"/></id><property column="name" name="name" type="string"/><set name="areas" lazy="true" cascade="all" inverse="false"> <key column="stateid"/> <one-to-many class="net.villion.model.test.Area"/></set></class></hibernate-mapping>
我们主要看inverse,cascade级联的设置。
当State.hbm.xml inverse = "false" cascade = "all"
//添加//code StateDAO sdao =(StateDAO) ctx.getBean("stateDAO");AreaDAO adao = (AreaDAO)ctx.getBean("areaDAO"); Area a3 = new Area();a3.setName("NewYork");Area a4 = new Area();a4.setName("Frolida");State s2 = new State();s2.setName("America"); Set set = new HashSet();set.add(a3);set.add(a4);s2.setAreas(set);sdao.saveObject(s2); //sql:Hibernate: insert into r_state (name) values (?)Hibernate: insert into r_area (name, stateid) values (?, ?)Hibernate: insert into r_area (name, stateid) values (?, ?)Hibernate: update r_area set stateid=? where ID=?Hibernate: update r_area set stateid=? where ID=?
//当State.hbm.xml inverse = "false" cascade = "none"(注意我们操作的是State)
//sql: insert into r_state (name) values (?)
Hibernate: update r_area set stateid=? where ID=?
org.springframework.dao.InvalidDataAccessApiUsageException: object references an unsaved transient instance
这时候更新area的时候由于area,并未级联插入所以找不到报错。所以这样设置还是会更新Area的stateid
接着上面的说,我们要看当设置改变时的sql变化。
上面就说明了cascade="all" 时候能级联插入,而none的时候只是维持两者之间的关系(inverse="false")。
上面两种情况的删除又不一样了,但是一个道理
cascade="all"时,两个表数据都级联删除了。
而cascade="none"时
Hibernate: update r_area set stateid=null where stateid=?
Hibernate: delete from r_state where ID=?说明它只是维持关系。
而当上面的inverse ="true"时 cascade="none"时
sql: insert into r_state (name) values (?)
只插入一条State,不会插入Area表了。
删除时
Hibernate: delete from r_state where ID=?
org.springframework.dao.DataIntegrityViolationException: (Hibernate operation): data integrity violated by SQL ''; nested exception is com.jnetdirect.jsql.u: DELETE 语句与 COLUMN REFERENCE 约束 'FKC7F1003A8EEBF16C' 冲突。该冲突发生于数据库 'hd',表 'r_area', column 'stateid'。
com.jnetdirect.jsql.u: DELETE 语句与 COLUMN REFERENCE 约束 'FKC7F1003A8EEBF16C' 冲突
由于没有维护数据库关系,引起外键冲突报错。
inverse ="true"时 cascade="all"时
sql:
Hibernate: insert into r_state (name) values (?)
Hibernate: insert into r_area (name, stateid) values (?, ?)
Hibernate: insert into r_area (name, stateid) values (?, ?)
全部级联插入,但r_area表中stateid是null。
删除时。
Hibernate: delete from r_area where ID=?
Hibernate: delete from r_area where ID=?
Hibernate: delete from r_state where ID=?
级联删除。
所以总结一下 ,cascade 是级联的程度,而inverse="false|ture" 是指是否维持两个实体的关系。(两个表的外键)。
水平有限,请各位看客口下留情。
如果耽误了你的宝贵,我在这里道歉了。 :(
发表评论
-
font-size和font标签的size属性对应关系
2012-11-23 15:11 0CSS absolute size keywords: xx- ... -
myeclipse6.0连接oracle10g ora-00604 ora-12705错误(转帖)
2011-04-25 16:44 1527文章转自以下网站:http://zhongweizhang.b ... -
The type java.lang.Object cannot be resolved解决方法
2011-04-15 15:14 1641最近,在Eclipse中导入其他项目,总是报下面2个错误。将项 ... -
div层被select下拉框遮盖问题解决
2010-12-07 10:11 2405div层被select下拉框遮盖问题解决 转载自:http:/ ... -
javascript中点号‘.’的使用
2010-01-31 09:12 1390转自:http://www.cnblogs.com/aspx3 ... -
一个程序员的多年珍藏(新增57本书:Java,Linux,Oracle,Perl)
2010-01-18 11:36 1086转自:http://jythoner.iteye.com/bl ... -
JBoss deploy 出现 OutOfMemoryError : PermGen space
2009-09-11 17:36 978最近在把在 tomcat 5.5 上开发的项目 deploy ... -
如何查看ext-2.0的文档
2009-05-07 10:28 1305看看ext-2.0的文档 api文档依然在docs目录下,虽然 ... -
Hibernate延迟加载机制
2009-05-05 18:28 938延迟加载: 延迟加载机制是为了避免一些无谓的性能开销而提出 ... -
xpath的异常
2009-01-08 15:12 21051.接收响应流的<?xml version=&quo ... -
java.lang.noclassdeffounderror: org/saxpath/saxpa
2009-01-06 14:49 1838java.lang.NoClassDefFoundError: ... -
Invalid value for getInt()
2008-12-20 10:42 3496由于把主键设置为string,当用hibernate处理后,会 ... -
用bulkUpdate执行删除批量的数据是出错!
2008-12-12 19:19 2951错误: org.springframework.dao.Inv ... -
org.springframework.jdbc.UncategorizedSQLException
2008-12-01 15:19 6581org.springframework.jdbc.Uncate ... -
myeclipse中使用svn
2008-11-21 11:36 8741myeclipse中使用svn 1.Help---> S ... -
ERROR - Connection is read-only.
2008-11-19 16:26 8395今天在serviceImpl的查询中,调用了一样更新的操作! ... -
Tomcat:IOException while loading persisted session
2008-11-12 10:26 956Tomcat在启动时出现如下异常问题: 严重: IOExce ... -
log4j相对路径的配置
2008-10-08 18:10 21871.web.xml中的配置 <context-par ... -
myeclipse如何设置断点
2008-10-07 10:04 6933Window->Open Perspective-> ... -
两个错误
2008-09-28 13:51 887<1>WARN action.RequestPro ...
相关推荐
### Hibernate Inverse 和 Cascade 的详细讲解 #### 一、引言 在ORM(Object-Relational Mapping)领域,Hibernate作为一款流行的Java持久层框架,它提供了丰富的API和配置选项来帮助开发者实现对象与数据库表之间...
Hibernate中cascade与inverse属性详解
在 Hibernate 框架中,`cascade` 和 `inverse` 是两个重要的概念,它们主要用于管理对象之间的持久化关系,特别是涉及到一对一(one-to-one)、一对多(one-to-many)和多对多(many-to-many)关系时。这两个属性都...
Hibernate中Inverse和Cascade的区别.html
在Java的持久化框架Hibernate中,级联操作(Cascade)和反转(Inverse)是两个重要的概念,它们主要用于管理对象关系模型中的关联关系。在一对多的关系中,这些特性可以帮助简化数据操作,提高代码的可读性和维护性...
至于博文链接,虽然没有提供具体内容,但可以推测博主可能详细讲解了在特定工具或框架中如何配置和使用“inverse”和“cascade”,并可能给出了一些示例和最佳实践。 在压缩包文件“inverse_cascade”中,可能包含...
在Hibernate中,`Inverse`是一个重要的概念,它涉及到实体之间的关联管理。本文将深入探讨`Inverse`属性,以及它在Hibernate中的作用和应用场景。 一、Hibernate与对象关系映射 Hibernate通过ORM机制将Java对象与...
在深入探讨Hibernate集合映射中的`inverse`与`cascade`属性之前,我们首先需要理解Hibernate框架的基本概念。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用程序提供了一种将对象模型与数据库...
### Hibernate中的Cascade选项详解 #### 一、概述 在Hibernate框架中,cascade选项提供了一种管理实体间关联的便捷方式,使得对一个实体的操作能够自动地应用到与之相关的其他实体上。这对于处理复杂的数据库关系...
在探讨Hibernate的`inverse`属性之前,我们先要理解Hibernate中的对象关系映射(ORM)以及持久化机制。Hibernate是一个流行的Java ORM框架,它允许开发者将数据库操作转换为面向对象的编程模型,使得数据操作更加...
在探讨Hibernate框架中的级联操作(cascade)与控制权反转(inverse)之前,我们需要先对Hibernate有一个基本的理解。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用提供了一种将对象模型映射到...
"NHibernate Inverse & Cascade"是两个关键概念,对于理解和有效使用NHibernate至关重要。 **Inverse属性** Inverse属性主要用于控制NHibernate如何处理关联对象的持久化。在一对多或多对一的关系中,当一个实体...
本文将深入探讨Hibernate中的一对多关系,并重点解析`inverse`属性的作用及其应用。 一对多关系是数据库设计中常见的关联类型,例如一个用户可以拥有多个订单,一个班级可以包含多个学生等。在Hibernate中,通过...
总之,理解并熟练运用Hibernate的关联映射、cascade和inverse是提升Java持久化编程能力的关键步骤。它们可以帮助我们更高效地管理对象与数据库之间的关系,同时降低开发复杂度。通过实践和研究给出的示例,相信你...
在Hibernate中,`cascade`和`inverse`是两个重要的概念,它们涉及到对象之间的关系管理和数据持久化。 **1. Hibernate Cascade** `cascade`属性主要用于控制对象间的级联操作。当在主对象上执行保存、更新、删除等...
在软件网络技术领域,尤其是在使用Hibernate这种对象关系映射(ORM)框架时,理解和正确使用`cascade`和`inverse`属性至关重要。这两个属性主要用于管理对象之间的关联关系,特别是如何在数据库中维护这些关系。 ...
### Hibernate常用注解详解 #### 一、JPA与Hibernate注解基础 JPA(Java Persistence API)是一种标准规范,用于实现对象关系映射(ORM),允许开发人员使用注解或XML来描述实体对象与数据库表之间的映射关系。...
在深入分析 Hibernate 结构框架之前,我们先来了解一下核心概念。 **1. Hibernate 配置文件** Hibernate 的配置文件通常为 `hibernate.cfg.xml`,它定义了数据库连接、缓存、事务管理和映射文件的位置。例如,你...