`
yuan_xulong
  • 浏览: 89620 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate中的inverse理解

    博客分类:
  • Java
阅读更多

    hibernate用了好久了,却还是一知半解,对很多概念都不是很清楚,今天又碰到了inverse的问题,总不能一次一次的应付下去,查了好久资料,终于对这个概念有了自己的理解,记笔记如下。

    inverse只能出现在hibernate中的一对多one-to-many和多对多many-to-many中,他表示了由哪一方来维护双方的关系,其实在many-to-one中也有这个inverse,只不过该值是false,且不能更改而已。inverse=true表示由对方来维护关系,而inverse=false表示由自己来维护关系,下面解释一下维护关系的概念。为了简单起见,在这儿配置没有使用级联设置。

    假设有两张表parent和child,parent和child是一对多的关系,一个parent可以有多个child,而多个child可以属于一个parent,假设XML配置如下:

 <class name="Parent" table="parent">
...  

<set name="children" table="child" lazy="true" cascade="none" inverse="true">
   <key column="parentID"></key>
   <one-to-many class="Child"/>
 </set>
 </class>


 <class name="Child" table="child">

   ...
  <many-to-one name="parent" class="one2many.Parent" cascade="none">
       <column name="parentID"/>
  </many-to-one>
 </class>

在parent的child中的inverse=true,这就表示由child来维护关系,也就是说在保存parent时候,是不会去维护与child的关系,而只有在保存child实体的时候才会把关系写入到数据库中。以下用例子说明:

 

1.inverse=true,代码如下:

Parent parent = new Parent();

Child child = new Child();

parent.getChildren().add(child);

child.setParent(parent);//如果没有这一句,会插入两条记录,但是child的parentID字段为空值

session.save(parent);

session.save(child);//在此处会保存关系

session.flush();

以下代码会生成SQL如下:

Hibernate: insert into parent (name, ID) values (?, ?)
Hibernate: insert into child (name, parentID, ID) values (?, ?, ?)

 

2.inverse=false,代码如下:

清单2.1

Parent parent = new Parent();

Child child = new Child();

parent.getChildren().add(child);

child.setParent(parent);//注释一

session.save(parent);

session.save(child);//在此处会保存关系

session.flush();

生成的SQL如下:

Hibernate: insert into parent (name, ID) values (?, ?)
Hibernate: insert into child (name, parentID, ID) values (?, ?, ?)
Hibernate: update child set parentID=? where ID=?

如果我们把注释一处的内容去掉或者注释,即代码如下:

清单2.2

Parent parent = new Parent();

Child child = new Child();

parent.getChildren().add(child);

//child.setParent(parent);//注释一

session.save(parent);

session.save(child);//在此处会保存关系

session.flush();

此时生成的SQL如下:

Hibernate: insert into parent (name, ID) values (?, ?)
Hibernate: insert into child (name, parentID, ID) values (?, ?, ?)
Hibernate: update child set parentID=? where ID=?

 

    此时好像看起来生成的代码是一样的,而且结果也是一样的,但实际上在第一处的时候生成插入child的时候,parentID是有值的,但是在注释掉后插入child的时候,parentID的值是null,如果在数据库中有外键约束的时候肯定会出错。清单2.1中生成的SQL和inverse=true进行比较,发现多了一条update语句,这个update是由parent创建的,因为parent也负责管理关系,这样导致多了一次操作。清单2.2中的代码在插入child的时候,首先会给parentID赋空值,然后再由parent负责更新child的parentID字段。

     以上就是个人对inverse的简单理解,如果有什么不对的地方,欢迎大家指正。

 

 

分享到:
评论

相关推荐

    彻底明白Hibernate中的Inverse

    总结来说,理解并合理运用Hibernate中的`Inverse`属性对于优化数据操作、提高代码可读性和维护性具有重要意义。通过精确控制关联的维护责任,我们可以更好地管理对象关系,实现高效且一致的数据库操作。

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

    综上所述,理解并正确使用Hibernate中的`inverse`属性对于优化JavaEE应用的数据库操作和提高代码质量具有重要意义。通过深入掌握这一特性,开发者能够更好地管理对象之间的关联,提升应用的性能和稳定性。

    hibernate inverse 个人总结.doc

    在探讨Hibernate的`inverse`属性之前,我们先要理解Hibernate中的对象关系映射(ORM)以及持久化机制。Hibernate是一个流行的Java ORM框架,它允许开发者将数据库操作转换为面向对象的编程模型,使得数据操作更加...

    hibernate inverse和cascade的详细讲解

    ### Hibernate Inverse 和 Cascade 的详细讲解 #### 一、引言 在ORM(Object-Relational Mapping)领域,Hibernate作为一款流行的Java持久层框架,它提供了丰富的API和配置选项来帮助开发者实现对象与数据库表之间...

    Hibernate中cascade与inverse属性详解

    在 Hibernate 框架中,`cascade` 和 `inverse` 是两个非常重要的属性,它们用于管理对象之间的关联关系。在深入讲解这两个属性之前,我们首先需要理解 Hibernate 中的一些基本概念,如 one-to-many 和 many-to-one ...

    Hibernate中cascade和inverse应用

    在 Hibernate 框架中,`cascade` 和 `inverse` 是两个重要的概念,它们主要用于管理对象之间的持久化关系,特别是涉及到一对一(one-to-one)、一对多(one-to-many)和多对多(many-to-many)关系时。这两个属性都...

    hibernate集合映射inverse和cascade详解.txt

    在深入探讨Hibernate集合映射中的`inverse`与`cascade`属性之前,我们首先需要理解Hibernate框架的基本概念。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用程序提供了一种将对象模型与数据库...

    Hibernate_级联关系说明_-_关于cascade和inverse的用法

    在探讨Hibernate框架中的级联操作(cascade)与控制权反转(inverse)之前,我们需要先对Hibernate有一个基本的理解。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用提供了一种将对象模型映射到...

    inverse=true的总结

    在IT行业中,尤其是在Java开发或者使用ORM框架(如Hibernate)时,“inverse=true”是一个非常重要的概念,它涉及到对象关系映射中的数据管理策略。本文将深入解析“inverse=true”的含义,以及它在实际应用中的作用...

    Hibernate 简单 PPT 总结

    在Hibernate中,`inverse`属性是一个关键的概念,它用于定义一对多或多对一关系中的维护端。`inverse="true"`表示另一端负责维护关联关系,这在处理关联实体的保存和更新时具有重要意义。例如,如果你有一个学生类和...

    hibernate

    根据提供的文件信息,我们可以深入探讨Hibernate框架中的几个关键概念,特别是`fetch`, `lazy`, `cascade`, 和 `inverse`关键字的使用与理解。这四个概念在处理对象关系映射(ORM)时非常重要,尤其是在Java环境下...

    inverse 例子

    在Hibernate这个强大的对象关系映射(ORM)框架中,`inverse`属性是一个非常重要的概念,它主要用于管理关联关系的维护责任。在这个例子中,我们将会深入理解`inverse`属性的作用,并通过一个简单的测试案例——`...

    hibernate bag 集合映射

    标题中的“hibernate bag 集合映射”指的是Hibernate框架中的一种关系映射机制。Hibernate是一个流行的Java ORM(对象关系映射)框架,它允许开发者将数据库表与Java类进行映射,使得在处理数据库操作时可以使用面向...

    Hibernate电子书(全)

    在关系数据库中,集合类型的数据(如Set、List、Map)不能直接存储,而Hibernate提供了将这些集合类型映射到数据库中的机制,如使用`Set`和`Map`映射关联关系,这使得Java对象的集合属性可以直接与数据库中的记录...

    hibernate常用注解

    ### Hibernate常用注解详解 #### 一、JPA与Hibernate注解基础 JPA(Java Persistence API)是一种标准规范,用于实现对象关系映射(ORM),允许...理解和熟练掌握这些注解对于使用Hibernate进行持久化操作至关重要。

    Hibernate开发租房系统2 源码

    描述提到“使用cascade和inverse优化区和街道关联关系”,这意味着我们将深入理解Hibernate的cascade和inverse属性,以及它们在双向一对多关联关系中的应用。 Hibernate是Java领域中广泛使用的对象关系映射(ORM)...

    hibernate中的集合映射范例程序

    在Hibernate中,我们可以使用`&lt;list&gt;`标签来映射,通过`index column`定义索引列,`inverse`属性控制关联的维护权。例如,一个学生可以有多个课程,那么课程可以被映射为List。 2. **Set映射**:Set不允许元素重复...

Global site tag (gtag.js) - Google Analytics