`
colonel
  • 浏览: 30914 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

hibernate:一对多关系中的inverse 和cascade

阅读更多
inverse 与 cascade 是正交的关系,不管 inverse 设置为什么值, 只要 cascade 设置为 “save-update”或者 “all”,当操作 Brand 或 Product 时,相关对象的操作(如果有)也会发生,但关系的建立则要看 inverse的值或者是对哪方进行操作。比如以下的代码,在不同的配置下产生不同的效果:(Brand 与 Product 是一对多的关系)

一、只操作 Brand:

   1. Brand b = new Brand();  
   2. b.setName("brand4");          
   3.  
   4. Product p = new Product();  
   5. p.setName("4p");  
   6. p.setBrand(b);  
   7.           
   8. b.addProduct(p); 
      session.save(b);


inverse="true",两者的关系由 Product 管理:

   1. <set name="products" inverse="true" cascade="save-update"> 
   2.     <key column="f_brand_id" />
   3.     <one-to-many class="model.Product"/>          
   4. set> 


输出语句是:
Hibernate: insert into brand_t (f_name) values (?)
Hibernate: insert into product_t (f_name) values (?)

这样的product 的 f_brand_id 为空,即它们之间的关系没有建立起来。

inverse="false",两者的关系由 Brand 管理:

   1. <set name="products" inverse="false" cascade="save-update"> 
   2.     <key column="f_brand_id" /> 
   3.     <one-to-many class="model.Product"/>          
   4. set> 


输出语句是:
Hibernate: insert into brand_t (f_name) values (?)
Hibernate: insert into product_t (f_name) values (?)
Hibernate: update product_t set f_brand_id=? where f_id=?

这样两者的关系就建立起来了。

二、看看操作 Product 的情况:

   1. Brand b = new Brand();  
   2. b.setName("brand4");          
   3.  
   4. Product p = new Product();  
   5. p.setName("4p");  
   6. p.setBrand(b);  
   7.           
   8. session.save(p);

   1. <many-to-one name="brand" 
   2.     class="model.Brand" 
   3.     cascade="none" 
   4.     column="f_brand_id" /> 


这时保存会出现org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: model.Brand 的异常,原因是 Brand 还不是一个持久化的东西,如果设置为:
cascade="save-update" 或 "all" ,则同时保存Brand 和 Product,且两者的关系也建立起来。

这时有点不同的是如果加上 b.getProducts().add(p); 这段代码,inverse="false" 的情况下会额外产生一条语句(why?):
Hibernate: update product_t set f_brand_id=? where f_id=?

实际运用当中很多时候都是由多的一方维持两者的关联,一的一方则掌管着多的“生杀大权”。比如:
xml 代码

   1. <set name="products" inverse="true" cascade="all"> 
   2.     <key column="f_brand_id" /> 
   3.     <one-to-many class="model.Product"/> 
   4. set> 


   1. <many-to-one name="brand" 
   2.     class="model.Brand" 
   3.     cascade="none" 
   4.     column="f_brand_id" /> 


大家使用的情况又是怎样的呢?
分享到:
评论
10 楼 xiaotian_ls 2008-06-10  
是不是数学专业的?
9 楼 hantsy 2007-09-18  
inverse主要影响insert, update语句。。。
设置inverse的目的主要是在于由哪一方管理关联关系,说白了就是由哪一方来管理表的外键。。。
上面的Brand和Product是一对多的关系。。。
考虑下面的代码,

brand.getProducts().add(product);
product.setBrand(brand);

如果在set上不使用inverse="true",上面的两行代码会更新外键,显然没有必要。
如果使用了inverse="true",第一行不会更新外键操作,外键由第二行代码进行维护。

inverse不影响cascade操作
8 楼 stonesfour 2007-09-18  
7 楼 四输五金 2007-07-22  
引用
inverse="true",两者的关系由 Product 管理:

   1. <set name="products" inverse="true" cascade="save-update"> 
   2.     <key column="f_brand_id" />
   3.     <one-to-many class="model.Product"/>          
   4. set> 


输出语句是:
Hibernate: insert into brand_t (f_name) values (?)
Hibernate: insert into product_t (f_name) values (?)

这样的product 的 f_brand_id 为空,即它们之间的关系没有建立起来。


为什么我这种情况是product的id不为空,而是正确的生成了,也就是说当inverse="false"时,对one一方作save操作时,它们之间的关系也被建立了?这是什么原因啊?
6 楼 fj_opensky 2007-07-08  
janh 写道
对于楼主说的inverse 与 cascade 是正交的关系不太理解是什么意思。

我理解的是这两者是没什么关系的,各管各的事情。
inverse只有在集合映射中才有,当inverse = true,字面意思好像是反转,由对方来维护关系,但实际还要看对方的配置,实际意思就是我不维护这个关系。当inverse = false意思就是我要维护这个关系,维护关系表现在行动上就是对于加入到这个集合或者从集合中移除的对象,对它的外键进行更新操作,使它与自己关联起来,将它的外键值设为null就是与自己脱离关系,或者是对中间表的操作(增删中间表的关联记录)。

inverse不会去删除对方这个对象,而cascade则可以级联删除或插入对方。inverse作用的基础是对方这个对象在数据库中存在,与cascade配合使用,作用的顺序也是cascade在前inverse在后。

所以对于多对一双向关联,因为多方已经可以建立关联关系,所以在一方的多方集合中就没必要再维护关系了,一般会设inverse = true。
对于多对多双向关联来说,则至少要有一方设置进行关联维护。


很好啊,谢谢.
5 楼 colonel 2007-06-19  
楼上表达的就是我理解的。
4 楼 janh 2007-06-19  
对于楼主说的inverse 与 cascade 是正交的关系不太理解是什么意思。

我理解的是这两者是没什么关系的,各管各的事情。
inverse只有在集合映射中才有,当inverse = true,字面意思好像是反转,由对方来维护关系,但实际还要看对方的配置,实际意思就是我不维护这个关系。当inverse = false意思就是我要维护这个关系,维护关系表现在行动上就是对于加入到这个集合或者从集合中移除的对象,对它的外键进行更新操作,使它与自己关联起来,将它的外键值设为null就是与自己脱离关系,或者是对中间表的操作(增删中间表的关联记录)。

inverse不会去删除对方这个对象,而cascade则可以级联删除或插入对方。inverse作用的基础是对方这个对象在数据库中存在,与cascade配合使用,作用的顺序也是cascade在前inverse在后。

所以对于多对一双向关联,因为多方已经可以建立关联关系,所以在一方的多方集合中就没必要再维护关系了,一般会设inverse = true。
对于多对多双向关联来说,则至少要有一方设置进行关联维护。
3 楼 colonel 2007-06-18  
问题是如果不加上b.addProduct(p);
在保存Product的同时也保存了Brand,且两者的关系也建立起来了。那干嘛还有加上b.addProduct(p); 让它操作多一次update呢。
2 楼 janh 2007-06-18  
这有什么奇怪的,b.addProduct(p);和b.getProducts().add(p);不是一样的嘛。你自己也说了inverse="false" 就是来管关系这个事情的嘛。
1 楼 colonel 2007-06-17  
。。。。。。
这个编辑器真的有问题,还是。。。
怎么后面的都没有啦,中间也断了。。。 
(谢谢版主帮我调出来

相关推荐

    hibernate inverse和cascade的详细讲解

    - **一对多**:假设有一个`Department`部门和多个`Employee`员工的关系,`inverse`属性通常放在`Employee`的映射文件中,并且设置为`false`。这意味着员工表负责维护与部门之间的关联关系。 - **多对多**:例如,...

    hibernate 级联(cascade和inverse)一对多

    在一对多的关系中,这些特性可以帮助简化数据操作,提高代码的可读性和维护性。下面将详细阐述这两个概念以及如何在实际应用中使用它们。 一、Hibernate级联(Cascade) 级联操作允许我们将对一个实体的更改自动...

    inverse和cascade使用阐述

    在数据库设计中,当我们在两个表之间建立一对多或者多对一的关系时,可能会涉及到“inverse”概念。例如,一个部门可以有多个员工,而一个员工只属于一个部门。这种情况下,员工表通常会有一个外键指向部门表。如果...

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

    1. **关联的插入和更新**:在一对多关系中,如果设置`inverse="true"`,那么在保存或更新父实体时,Hibernate会自动处理与子实体的关联,添加新的子实体或更新已存在的关联。相反,如果在子实体上操作,Hibernate将...

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

    在Hibernate中,`inverse`属性主要用于多对一或一对多的关系中,用于指定哪一方负责维护关系。当两个实体之间存在关联时,如果一方的集合变更,那么另一方的实体可能也需要更新。这时,`inverse`属性就变得尤为重要...

    Hibernate中cascade和inverse应用

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

    Hibernate映射一对多关联关系

    使用Hibernate进行一对多关联关系的映射,主要通过在XML映射文件中定义 `&lt;many-to-one&gt;` 和 `&lt;set&gt;` 标签来实现。 ##### 映射 `Order` 类 ```xml ``` 在上面的映射文件中: - `&lt;many-to-one&gt;` 元素...

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

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

    Hibernate双向一对多

    标题"Hibernate双向一对多"指的是Hibernate框架中的一个重要关系映射概念,即在一个实体类中,一个实例可以与多个另一个实体类的实例相关联,而在另一个实体类中,每个实例也可以关联到该实体类的一个实例。这种关系...

    hibernate一对多关系

    在这个"hibernate一对多关系"的资源中,我们主要探讨的是Hibernate如何处理一个实体类与多个实体类之间的关联关系。 在数据库设计中,一对多关系是非常常见的一种关系类型,比如一个部门可以有多个员工,一个学生...

    hibernate之一对多配置demo

    一、Hibernate一对多关系 在现实世界中,一对多关系很常见,例如一个班级可以有多名学生。在数据库中,这对应于一个表(如班级表)有一条记录可以关联多条记录(如学生表)。在Hibernate中,我们通过配置XML文件来...

    Hibernate的多对一和一对多操作实例

    - **映射配置**:在`CUSTOMER.hbm.xml`映射文件中,可以看到`&lt;set&gt;`元素用于定义一对多关系,其中`inverse="true"`属性表示反向操作由另一方负责,`lazy="true"`则表示延迟加载,`cascade="all"`意味着当父对象发生...

    hibernate一对多案例

    本案例主要探讨的是Hibernate中的一对多关系映射,这是一种常见的对象关系映射(ORM)配置,用于表示一个实体与多个其他实体之间的关联。 在传统的数据库设计中,一对多关系是指一个表(父表)中的记录可以与另一个...

    Hibernate(一对多表操作)

    本篇主要讨论的是Hibernate中的一对多关系映射,以及如何在实际操作中进行配置和使用。 一对多关系指的是一个实体可以与多个其他实体相关联。例如,在用户系统中,一个用户可以有多个订单,这就是典型的一对多关系...

    hibernate一对多代码

    本文将详细解析"hibernate一对多映射"的概念、配置及其实现过程,以帮助理解并掌握这一核心特性。 首先,我们要明白在关系型数据库中,"一对多"关系意味着一个实体(比如一个部门)可以有多个相关实体(如部门下的...

    hibernate 一对多

    一、Hibernate一对多关系概述 在数据库设计中,一对多关系意味着一个表(父表)中的记录可以与另一个表(子表)中的多个记录相对应。例如,一个学生可以有多个课程,而一门课程可以被多个学生选修。在Hibernate中,...

    Hibernate学习之 : 一对多关联映射

    这篇文章将深入探讨Hibernate中的一对多关联映射,这是一种常见的关系数据库模型,在实际开发中经常遇到。我们将从基本概念、配置、映射文件以及具体示例等方面进行详细讲解。 **一对多关联映射基础** 在数据库...

    hibernate_配置cascade_及all-delete-orphan.doc

    通常用于一对多或多对多的关系中。 6. **none**: 表示没有任何级联行为,这是默认的行为。需要注意的是,在`save-update`和`delete`操作中,级联保存和级联更新总是绑定在一起的,因此没有单独的`save`或`update`...

Global site tag (gtag.js) - Google Analytics