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" />
大家使用的情况又是怎样的呢?
分享到:
相关推荐
- **一对多**:假设有一个`Department`部门和多个`Employee`员工的关系,`inverse`属性通常放在`Employee`的映射文件中,并且设置为`false`。这意味着员工表负责维护与部门之间的关联关系。 - **多对多**:例如,...
在一对多的关系中,这些特性可以帮助简化数据操作,提高代码的可读性和维护性。下面将详细阐述这两个概念以及如何在实际应用中使用它们。 一、Hibernate级联(Cascade) 级联操作允许我们将对一个实体的更改自动...
在数据库设计中,当我们在两个表之间建立一对多或者多对一的关系时,可能会涉及到“inverse”概念。例如,一个部门可以有多个员工,而一个员工只属于一个部门。这种情况下,员工表通常会有一个外键指向部门表。如果...
1. **关联的插入和更新**:在一对多关系中,如果设置`inverse="true"`,那么在保存或更新父实体时,Hibernate会自动处理与子实体的关联,添加新的子实体或更新已存在的关联。相反,如果在子实体上操作,Hibernate将...
在Hibernate中,`inverse`属性主要用于多对一或一对多的关系中,用于指定哪一方负责维护关系。当两个实体之间存在关联时,如果一方的集合变更,那么另一方的实体可能也需要更新。这时,`inverse`属性就变得尤为重要...
在 Hibernate 框架中,`cascade` 和 `inverse` 是两个重要的概念,它们主要用于管理对象之间的持久化关系,特别是涉及到一对一(one-to-one)、一对多(one-to-many)和多对多(many-to-many)关系时。这两个属性都...
使用Hibernate进行一对多关联关系的映射,主要通过在XML映射文件中定义 `<many-to-one>` 和 `<set>` 标签来实现。 ##### 映射 `Order` 类 ```xml ``` 在上面的映射文件中: - `<many-to-one>` 元素...
在探讨Hibernate框架中的级联操作(cascade)与控制权反转(inverse)之前,我们需要先对Hibernate有一个基本的理解。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用提供了一种将对象模型映射到...
标题"Hibernate双向一对多"指的是Hibernate框架中的一个重要关系映射概念,即在一个实体类中,一个实例可以与多个另一个实体类的实例相关联,而在另一个实体类中,每个实例也可以关联到该实体类的一个实例。这种关系...
在这个"hibernate一对多关系"的资源中,我们主要探讨的是Hibernate如何处理一个实体类与多个实体类之间的关联关系。 在数据库设计中,一对多关系是非常常见的一种关系类型,比如一个部门可以有多个员工,一个学生...
一、Hibernate一对多关系 在现实世界中,一对多关系很常见,例如一个班级可以有多名学生。在数据库中,这对应于一个表(如班级表)有一条记录可以关联多条记录(如学生表)。在Hibernate中,我们通过配置XML文件来...
- **映射配置**:在`CUSTOMER.hbm.xml`映射文件中,可以看到`<set>`元素用于定义一对多关系,其中`inverse="true"`属性表示反向操作由另一方负责,`lazy="true"`则表示延迟加载,`cascade="all"`意味着当父对象发生...
本案例主要探讨的是Hibernate中的一对多关系映射,这是一种常见的对象关系映射(ORM)配置,用于表示一个实体与多个其他实体之间的关联。 在传统的数据库设计中,一对多关系是指一个表(父表)中的记录可以与另一个...
本篇主要讨论的是Hibernate中的一对多关系映射,以及如何在实际操作中进行配置和使用。 一对多关系指的是一个实体可以与多个其他实体相关联。例如,在用户系统中,一个用户可以有多个订单,这就是典型的一对多关系...
本文将详细解析"hibernate一对多映射"的概念、配置及其实现过程,以帮助理解并掌握这一核心特性。 首先,我们要明白在关系型数据库中,"一对多"关系意味着一个实体(比如一个部门)可以有多个相关实体(如部门下的...
一、Hibernate一对多关系概述 在数据库设计中,一对多关系意味着一个表(父表)中的记录可以与另一个表(子表)中的多个记录相对应。例如,一个学生可以有多个课程,而一门课程可以被多个学生选修。在Hibernate中,...
这篇文章将深入探讨Hibernate中的一对多关联映射,这是一种常见的关系数据库模型,在实际开发中经常遇到。我们将从基本概念、配置、映射文件以及具体示例等方面进行详细讲解。 **一对多关联映射基础** 在数据库...
通常用于一对多或多对多的关系中。 6. **none**: 表示没有任何级联行为,这是默认的行为。需要注意的是,在`save-update`和`delete`操作中,级联保存和级联更新总是绑定在一起的,因此没有单独的`save`或`update`...