以前在刚接触hibernate时,在看到一对多、多对一双向关联映射时,对inverse属性很是纳闷,久久不能理解,现在闲着无事,看了看hibernate,总结一下:
一,我认为,inverse应当是在创建双向关联时,会起到作用,如果只建立单向的关联,没有必要设置此属性。
二,对于(双向关联的)保存来说,如果我们设置了inverse="true",省去执行update的sql语句,提高效率。
例如:
顾客:Customer
购买物品:Order
(它们是一对多的关系,且建立了双向关联关系。)
Customer customer = new Customer();
customer.setName(userName);
Order order = new Order();
order.setOrderName(orderName);
order.setCustomer(customer);
customer.getOrders().add(order);
sess.save(customer);
如果inverse="false",Hibernate的执行过程如下:
1)通过insert语句持久化Customer信息
2)通过insert语句持久化Order信息,此时的外键为空
3)通过update语句更新Order信息记录的外键
如果inverse="true",Hibernate的执行过程如下:
1)通过insert语句持久化Customer信息
2)通过insert语句持久化Order信息,此时的外键不为空
由此可见:对于“保存”操作来讲,我们设置inverse="true",可以省去update更新操作,insert时,子表中外键信息同时保存到表中。
三,对于(双向关联的)更新来说,如果我们设置了inverse="true",可以减少执行update的sql语句,提高效率。
对于同样上边的例子:
Customer customer = (Customer)session.load(Customer.class,new Long(2));
Order order = (Order)session.load(Order.class,new Long(2));
order.setName("更新名称");
order.setOrder(order);
customer.getOrder.add(order);
如果inverse="false",Hibernate的执行过程如下:
1)order.setName(updateName);
即:update order set name="更新名称" customerId=2 where id=2
2)customer.getOrder.add(order);
即:update order set customerId=2 where id=2
(这两条sql语句,实现了同样的功能,所以多执行了一条sql语句,影响了性能)
如果inverse="true",Hibernate的执行过程如下:
order.setName(updateName);
即:update order set name="更新名称" customerId=2 where id=2
由此可见:对于“更新”操作来讲,我们设置inverse="true",可以减少update更新操作。
应当注意的几点:
一)上边提到的设置inverse="true",指的都是在set中设置,比如:
<set name="orders" cascade="save-update" inverse="true">
<key colomn="customerId"/>
<one-to-many class="mypack.Order"/>
</set>
这样可以最大限度的减少要执行的update语句,提高性能。
二)以上提到的都是双向关联,我们在操作(保存或更新)时,双方一定要都建立关联。比如:
order.setOrder(order);
customer.getOrder.add(order);
不能只建立一方。
分享到:
相关推荐
本文将深入探讨Hibernate中的一对多关系,并重点解析`inverse`属性的作用及其应用。 一对多关系是数据库设计中常见的关联类型,例如一个用户可以拥有多个订单,一个班级可以包含多个学生等。在Hibernate中,通过...
Hibernate中cascade与inverse属性详解
Hibernate 配置文件详解 Hibernate 是一个流行的 ORM(Object-Relational Mapping)框架,用于简化 Java 应用程序中的数据库交互。 Hibernate 的配置文件是其核心组件之一,用于定义 Hibernate 的运行期参数。下面...
在深入探讨Hibernate集合映射中的`inverse`与`cascade`属性之前,我们首先需要理解Hibernate框架的基本概念。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用程序提供了一种将对象模型与数据库...
**Hibernate对象关系详解** 在Java世界中,Hibernate作为一款强大的对象关系映射(ORM)框架,使得开发者可以方便地在Java对象与数据库表之间进行数据操作。本篇将深入探讨Hibernate中的对象关系映射,包括一对一...
在这些配置选项中,`inverse`和`cascade`是最具挑战性的两个概念之一。它们主要用于控制对象之间关联关系的维护以及操作的级联行为。本文将详细介绍这两个属性的概念、作用以及应用场景,并通过示例来帮助读者更好地...
### Hibernate映射关联详解 #### 一、理解一对多双向关联关系 在关系型数据库设计中,一对多关联是常见的数据组织方式之一。而在面向对象编程语言中,这种关系则通常通过集合(如Set或List)来实现。本文将重点...
hibernate概述,hibernate入门Demo,hibernate配置文件详解(全局配置,实体类映射配置),配置实体规则,核心API详解(Configuration,sessionFactory,session,Transaction),hibernate中的对象状态以及刷新能缓存机制 ...
### Hibernate配置详解(二)——深入理解`.hbm.xml`文件与实体关联 #### 引言 在前文《Hibernate 配置详解》中,我们已经初步探讨了Hibernate框架的基本配置,包括`hibernate.cfg.xml`文件的重要性及其在...
Spring集成Struts与Hibernate入门详解 Spring框架是Java平台上一个开源的轻量级框架,它提供了许多功能强大且灵活的模块,以帮助开发者快速构建企业级应用程序。Struts是Apache软件基金会的一个开源项目,提供了一...
2.4.1 Hibernate的核心接口 2.4.2 事件处理接口 2.4.3 Hibernate映射类型接口 2.4.4 可供扩展的接口 2.5 小结 2.6 思考题 第3章 第一个Hibernate应用 3.1 创建Hibernate的配置文件 3.2 创建持久化类...
【Hibernate配置文件中映射元素详解】 在对象关系映射(ORM)框架Hibernate中,对象与数据库表之间的关联是通过一个XML配置文件来定义的。这个XML文件包含了映射元素,用于描述Java类如何转化为数据库中的表。映射...
### Hibernate常用注解详解 #### 一、JPA与Hibernate注解基础 JPA(Java Persistence API)是一种标准规范,用于实现对象关系映射(ORM),允许开发人员使用注解或XML来描述实体对象与数据库表之间的映射关系。...
以下是对Hibernate一对多映射配置的详解: 一、XML文件配置 1. 单向关联 在这种配置中,关系只在一个方向上定义,例如User类有多个Account。在User的配置文件中,不直接声明与Account的关联,而是在Account的配置...
**Hibernate 结构框架详解** Hibernate 是一款流行的 Java ORM(对象关系映射)框架,它允许开发者将数据库操作转化为对 Java 对象的操作,简化了数据库应用的开发。在深入分析 Hibernate 结构框架之前,我们先来...
【Hibernate关键知识点详解】 Hibernate是一款强大的Java持久化框架,它为开发者提供了在关系数据库与对象模型之间进行映射的能力,从而简化了数据访问层的开发。在这个知识点大全中,我们将深入探讨Hibernate的...