最近在使用Hibernate的时候,发现其中在管理对象间关系时有一个 inverse 属性,原来没太在意,仔细研究下发现这个属性还是比较关键的,详细解释一下
inverse属性一般是用在 1-N 对象关系中,默认值为 false
以 Parent,Child 这2个对象举例,从他们的关系上2者是 1-N 关系,PO对象描述通常为:
Parent 中包含一个属性 Set<Child> children
Child 中包含一个属性 Parent parent
Parent对应的hbm文件通常这样配置
<set property="children" cascade="all">
<key column="parent_id"/>
<ont-to-many class="Child"/>
</set>
这里,<set>标签中未配置 inverse 属性,其实代表 <set ... inverse="false">
说明 1-N 关系中,关系的建立由当前对象完成(也就是Parent负责)
在保存关联数据时需要将 Parent 作为主要操作目标,最后使用 session.save(parent) 来完成关联保存操作
Parent parent = ....;
Set<Child> children = ....;
parent.setChildren(children);
Transaction tx = session.beginTransaction();
// 注意这里要保存parent(主控对象)
session.save(parent);
tx.commit();
session.close();
如果设置为 <set ... inverse="true">,代表将对象关联关系的维护工作交给 N 端对象完成,那么按照以上方法使用 session 保存 parent 将会发现数据不完整,因为 inverse="true" 以后 parent 在保存和更新动作中不负责对关联关系进行维护(仅可关联查询),关系控制权现在交由 N 段 Child 对象,所以应该用 session 保存 Child;
Parent parent = ...;
Child child = ...;
child.setParent(parent);
Transaction tx = session.beginTransaction();
// 注意这里保存的对象应该是Child,因为关系控制权已经交给Many一端
session.save(child);
tx.commit();
session.close();
总结
简单来说,one-to-many 关系我们默认将 one 作为主控对象,many 作为附属属性,在默认情况下通过保存主控对象随带着完成附属属性的保存,并完成2者关系的建立(默认inverse="false"就是应对这种情况)
但如果根据业务需要,想以附属对象作为操作入口的话,就应该将 inverse 属性设置为 true
举个购物车的例子
用户和订单 是 one-to-many 的关系
订单和订单内的每条购买记录也是 one-to-many 的关系
从业务操作习惯上,用户执行下单时,应用实现习惯是保存“订单”对象,而不是保存“用户”对象
因此 用户-订单 关系的配置上就应该设置 inverse="true"
同样,在保存订单时要保存订单内每一条购买记录,应用实现习惯是保存“订单”对象,附带着把包括的购买记录也保存下来
因此 订单-记录 关系的配置上就应该设置 inverse="false"
分享到:
相关推荐
Hibernate 配置文件详解 Hibernate 是一个流行的 ORM(Object-Relational Mapping)框架,用于简化 Java 应用程序中的数据库交互。 Hibernate 的配置文件是其核心组件之一,用于定义 Hibernate 的运行期参数。下面...
在深入探讨Hibernate集合映射中的`inverse`与`cascade`属性之前,我们首先需要理解Hibernate框架的基本概念。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用程序提供了一种将对象模型与数据库...
在 Hibernate 框架中,`cascade` 和 `inverse` 是两个非常重要的属性,它们用于管理对象之间的关联关系。...在实际开发中,需要根据业务需求灵活调整 `cascade` 和 `inverse` 的配置,以达到最佳的数据管理和性能优化。
本文将深入探讨Hibernate中的一对多关系,并重点解析`inverse`属性的作用及其应用。 一对多关系是数据库设计中常见的关联类型,例如一个用户可以拥有多个订单,一个班级可以包含多个学生等。在Hibernate中,通过...
在这些配置选项中,`inverse`和`cascade`是最具挑战性的两个概念之一。它们主要用于控制对象之间关联关系的维护以及操作的级联行为。本文将详细介绍这两个属性的概念、作用以及应用场景,并通过示例来帮助读者更好地...
使用JUnit进行测试是验证Hibernate配置和功能的一种常见方法。你可以创建测试类,模拟数据的增删改查操作,然后检查数据库中的记录是否符合预期。例如,你可以创建一个父实体,添加一些子实体,并设置级联操作为`...
### Hibernate配置要点详谈 #### 一、配置文件与配置方式 在Hibernate中,有两种主要的配置文件形式:`hibernate.cfg.xml` 和 `hibernate.properties`。 1. **`hibernate.cfg.xml`**: - 这种配置文件通常包含...
【Hibernate配置文件中映射元素详解】 在对象关系映射(ORM)框架Hibernate中,对象与数据库表之间的关联是通过一个XML配置文件来定义的。这个XML文件包含了映射元素,用于描述Java类如何转化为数据库中的表。映射...
在本文中,我们将深入探讨Hibernate配置文件中的映射元素,这些元素是将对象关系映射到数据库的关键部分。首先,我们需要了解映射文件的基本结构,它通常是一个XML文档,遵循特定的DTD(文档类型定义)。 `...
为了更好地理解和运用Hibernate中的关联映射机制,我们需要深入了解其常用的属性及其作用。 ##### 1. `<class>`元素 - **`name`**:指定类的完整包名,如`com.example.Person`。 - **`table`**:对应数据库中的...
hibernate概述,hibernate入门Demo,hibernate配置文件详解(全局配置,实体类映射配置),配置实体规则,核心API详解(Configuration,sessionFactory,session,Transaction),hibernate中的对象状态以及刷新能缓存机制 ...
`hibernate-mapping`节点是Hibernate映射文件中的顶级节点,用于定义一系列配置选项,控制整个映射文件的行为和映射规则。这些配置包括数据库连接细节、默认的映射策略等。 - **schema**: 定义了数据库的Schema名称...
### Hibernate配置详解(二)——深入理解`.hbm.xml`文件与实体关联 #### 引言 在前文《Hibernate 配置详解》中,我们已经初步探讨了Hibernate框架的基本配置,包括`hibernate.cfg.xml`文件的重要性及其在...
《Hibernate配置文件与类映射详解》 Hibernate作为一款强大的对象关系映射(ORM)框架,简化了Java应用与数据库之间的交互。本文将深入探讨Hibernate的配置文件和类映射文件的常用写法,帮助开发者更好地理解和应用...
"Inverse.png"可能是一个示例图,直观地展示了`inverse`属性在对象关系映射中的作用。 一系列PPT文件提供了关于Hibernate的深入学习材料: - "2018-7-27-Hibernate-检索方式.pptx"可能涵盖了Hibernate的多种检索...
#### 二、一对多关系的Hibernate配置示例 下面展示了一对多关系在Hibernate中的具体配置方式: **消费者类(Customer)的配置**: ```xml <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD...
以上就是 Hibernate 中的一对多、多对一和多对多关系的配置和使用方法。理解这些关系并正确配置它们是充分利用 Hibernate 框架的关键。在实际项目中,根据业务需求选择合适的关系映射方式,并灵活运用,能够简化...
【hibernate之一对多配置demo】:在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库与Java对象之间的交互。本教程主要关注Hibernate中的一对多关系配置,并通过XML来实现,同时也涵盖了...
### Hibernate配置详解与实践 #### 引言 Hibernate是一个开源的对象关系映射(ORM)框架,它能够将Java对象映射到关系型数据库中的表,从而简化了数据持久化层的开发工作。本文将深入探讨Hibernate配置的关键点,...