最近在使用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入门Demo,hibernate配置文件详解(全局配置,实体类映射配置),配置实体规则,核心API详解(Configuration,sessionFactory,session,Transaction),hibernate中的对象状态以及刷新能缓存机制 ...
hibernate 级联(cascade和inverse)一对多,Jar包,数据库建表语句都好了,只要修改一下,数据库配置文件,就可以使用了,使用junit进行测试。
Hibernate的二级缓存策略,是针对于ID查询的缓存策略,对于条件查询则毫无作用。为此,Hibernate提供了针对条件查询的Query Cache。 2.3.2. 什么样的数据适合存放到第二级缓存中? 1 很少被修改的数据 2 不是很...
3.1 创建Hibernate的配置文件 3.2 创建持久化类 3.3 创建数据库Schema 3.4 创建对象-关系映射文件 3.4.1 映射文件的文档类型定义(DTD) 3.4.2 把Customer持久化类映射到CUSTOMERS表 3.5 通过...
本章主要介绍关系数据库中的代理主键(不具有业务含义),接着介绍Hibernate提供的几种内置标识符生成器的用法及适用范围。 6.1 关系数据库按主键区分不同的记录 123 6.1.1 把主键定义为自动增长标识符类型 123 ...
通过@SequenceGenerator 和 @TableGenerator 可以配置不同的 identifier 生成器。 table="GENERATOR_TABLE" pk-column-name="key" value-column-name="hi" pk-column-value="EMP" allocation-size="20"/> //...
3.1 创建Hibernate的配置文件 3.2 创建持久化类 3.3 创建数据库Schema 3.4 创建对象-关系映射文件 3.4.1 映射文件的文档类型定义(DTD) 3.4.2 把Customer持久化类映射到CUSTOMERS表 3.5 通过...
3.1 创建Hibernate的配置文件 3.2 创建持久化类 3.3 创建数据库Schema 3.4 创建对象-关系映射文件 3.4.1 映射文件的文档类型定义(DTD) 3.4.2 把Customer持久化类映射到CUSTOMERS表 3.5 通过...
3.1 创建Hibernate的配置文件 3.2 创建持久化类 3.3 创建数据库Schema 3.4 创建对象-关系映射文件 3.4.1 映射文件的文档类型定义(DTD) 3.4.2 把Customer持久化类映射到CUSTOMERS表 3.5 通过...
本章主要介绍关系数据库中的代理主键(不具有业务含义),接着介绍Hibernate提供的几种内置标识符生成器的用法及适用范围。 6.1 关系数据库按主键区分不同的记录 123 6.1.1 把主键定义为自动增长标识符类型 123 ...
和其它许多批注一样,在多对多关联中很多值是自动生成,党双向多对多关联中没有定义任何物理映射时,Hibernate根据以下规则生成相应的值,关联表名:主表表名+下划线+从表表名,关联到主表的外键名:主表名+下划线+...
@OneToMany(mappedBy 相当于 inverse ) @ManyToOne 结合 @JoinColumn 添加一列外键 @ManyToMany 一方写 mappedBy 放弃外键维护、另一方 @JoinTable 维护中间表 收派标准修添加能实现 html 请求 后台...
Java正则表达式 批量上传--采集 (多个文件夹) The Agile Way hibernate mapping文件中的标记详解:关系标记 ANT 安装使用及build.xml文档模板 inverse和cascade在关联更新中的作用 hibernate ...
Hibernate 配置 .............................................................................................. 17 第一段代码 ..............................................................................
9、hibernate的inverse属性的作用? 13、在DAO中如何体现DAO设计模式? 14、spring+Hibernate中委托方案怎么配置? 15、spring+Hibernate中委托方案怎么配置? 16. hibernate进行多表查询每个表中各取几个字段,也...
9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各取几...
9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各取几...
9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各取几...