`
malipei
  • 浏览: 71059 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

inverse作用

阅读更多

我们说inverse设立不当会导致性能低下,其实是说inverse设立不当,会产生多余重复的SQL语句甚至致使JDBC exception的throw。这是我们在建立实体类关系时必须需要关注的地方。一般来说,inverse=true是推荐使用,双向关联中双方都设置inverse=false的话,必会导致双方都重复更新同一个关系。但是如果双方都设立inverse=true的话,双方都不维护关系的更新,这也是不行的,好在一对多中的一端:many-to-one默认是inverse=false,避免了这种错误的产生。但是对多对就没有这个默认设置了,所以很多人经常在多对多的两端都使用inverse=true,结果导致连接表的数据根本没有记录,就是因为他们双分都没有责任维护关系。所以说,双向关联中最好的设置是一端为inverse=true,一端为inverse=false。一般inverse=false会放在多的一端,那么有人提问了,many-to-many两边都是多的,inverse到底放在哪儿?其实hibernate建立多对多关系也是将他们分离成两个一对多关系,中间连接一个连接表。所以通用存在一对多的关系,也可以这样说:一对多是多对多的基本组成部分。

测试cascade和inverse.分析结果以及具体hibernate sql都在,比较容易看明白。

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                
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 &#39;&#39;; nested exception is com.jnetdirect.jsql.u: DELETE 语句与 COLUMN REFERENCE 约束 &#39;FKC7F1003A8EEBF16C&#39; 冲突。该冲突发生于数据库 &#39;hd&#39;,表 &#39;r_area&#39;, column &#39;stateid&#39;。
com.jnetdirect.jsql.u: DELETE 语句与 COLUMN REFERENCE 约束 &#39;FKC7F1003A8EEBF16C&#39; 冲突
由于没有维护数据库关系,引起外键冲突报错。
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" 是指维持两个实体的关系。(两个表的外键)

分享到:
评论

相关推荐

    inverse=true的总结

    本文将深入解析“inverse=true”的含义,以及它在实际应用中的作用。 `inverse`属性是Hibernate框架中的一个关键设置,它用于控制一对多(One-to-Many)或一对一(One-to-One)关联关系的维护责任。在Hibernate中,...

    hibernate inverse和cascade的详细讲解

    - **Inverse 的作用** - **定义**:`inverse`属性决定了一端是否负责维护关联关系。 - **适用场景**:`inverse`仅适用于`one-to-many`或`many-to-many`关系,因为这两种关系包含了集合。对于`one-to-one`和`many-...

    inverse 例子

    在这个例子中,我们将会深入理解`inverse`属性的作用,并通过一个简单的测试案例——`InverseTest`来阐述其工作原理。 首先,`inverse`属性主要应用于一对多(OneToMany)和多对一(ManyToOne)的关系映射中。默认...

    彻底明白Hibernate中的Inverse

    本文将深入探讨`Inverse`属性,以及它在Hibernate中的作用和应用场景。 一、Hibernate与对象关系映射 Hibernate通过ORM机制将Java对象与数据库表进行对应,使得开发者可以在Java代码中操作对象,而无需直接编写SQL...

    inverse_c语言inverse_inverse在C_cinverse_c语言longinverse_反插值_

    总的来说,这个C语言实现的反插值程序是一个有价值的教育资源,它可以帮助开发者学习如何在实际问题中应用反插值技术,并理解正则化在优化插值过程中的作用。通过阅读和分析源代码,不仅可以提升C语言编程技能,还...

    JavaEE学习笔记之Hibernate表关系之一对多(inverse详解)

    本文将深入探讨Hibernate中的一对多关系,并重点解析`inverse`属性的作用及其应用。 一对多关系是数据库设计中常见的关联类型,例如一个用户可以拥有多个订单,一个班级可以包含多个学生等。在Hibernate中,通过...

    matlab开发-Pseudoinverse

    在MATLAB中,"Pseudoinverse",也称为广义逆或摩尔-彭若斯逆,是一种解决矩阵方程的重要工具。本教程将深入探讨如何在MATLAB环境中使用矩阵因式分解来计算伪逆。 一、矩阵的伪逆 1.1 伪逆的定义:对于矩阵A,如果...

    Computational Methods for Inverse Problems

    它不仅在传统的应用领域(如遥感、医学成像)中发挥着重要作用,同时也在新兴的科技(如人工智能)中拓展了其应用范围。随着研究的深入和技术的发展,逆问题求解的理论和方法将会持续改进,从而在科学探索和技术革新...

    A Qualitative Approach to Inverse Scattering Theory

    这个领域的研究对于理解波在各种介质中的传播和相互作用至关重要,尤其在地震学、雷达探测、医学成像等领域具有广泛的应用。由于逆散射问题通常是病态的(即解的存在性、唯一性和稳定性难以保证),因此研究者们发展...

    Inverse Synthetic Aperture Radar Imaging

    高分辨率雷达成像是一个多学科交叉领域,在不同的应用中发挥着重要作用。在雷达遥感中,通常使用合成孔径雷达(SAR)图像来绘制地形;而在国防工业中,移动目标的ISAR成像是自动目标识别的重要工具之一。本文研究的...

    关联映射cascade,inverse讲解

    本篇将深入讲解“cascade”和“inverse”这两个重要的概念,以及它们在实际应用中的作用。 首先,让我们理解一下“关联映射”。在Hibernate中,关联映射允许我们将Java对象与数据库表的记录进行关联。例如,一个...

    Hibernate中cascade和inverse应用

    这两个属性都是用来处理实体间关联的维护策略,但它们的作用和应用场景有所不同。 **1. cascade 级联操作** `cascade` 属性主要用于定义当一个实体被持久化(保存、更新或删除)时,是否将这些操作“级联”到与其...

    inverse_transformation_2.rar_TRANSFORMATION_inverse_transform

    文件"Inverse_transformation_2.r"可能包含了一个实际的逆变换算法的实现,或者是一组用于测试逆变换效果的数据。 逆变换在许多领域都有广泛的应用。在信号处理中,逆变换常用于信号恢复或去噪。例如,在音频处理中...

    关于cascade和inverse属性[文].pdf

    `cascade`作用于整个关联集合,不论集合是否为空,而`inverse`只影响集合本身,不涉及集合内的元素级操作。 总结起来,`cascade`和`inverse`是Hibernate中用于管理对象关联关系的重要属性,它们共同确保了数据的...

    transformation-du-park-inverse.zip_TRANSFORMATION_park inverse

    而"逆变换公园",即"transformation du park inverse",则是Park变换的反过程,用于将d、q坐标系的变量转换回原始的三相a、b、c坐标系。这一过程对于理解和实现交流电机的闭环控制具有核心地位。 Park变换的起源...

Global site tag (gtag.js) - Google Analytics