`
lj6684
  • 浏览: 955856 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

Hibernate配置中inverse的作用

阅读更多

最近在使用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概述,hibernate入门Demo,hibernate配置文件详解(全局配置,实体类映射配置),配置实体规则,核心API详解(Configuration,sessionFactory,session,Transaction),hibernate中的对象状态以及刷新能缓存机制 ...

    hibernate 级联(cascade和inverse)一对多

    hibernate 级联(cascade和inverse)一对多,Jar包,数据库建表语句都好了,只要修改一下,数据库配置文件,就可以使用了,使用junit进行测试。

    hibernate 3中的缓存小结

     Hibernate的二级缓存策略,是针对于ID查询的缓存策略,对于条件查询则毫无作用。为此,Hibernate提供了针对条件查询的Query Cache。 2.3.2. 什么样的数据适合存放到第二级缓存中? 1 很少被修改的数据 2 不是很...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     3.1 创建Hibernate的配置文件  3.2 创建持久化类  3.3 创建数据库Schema  3.4 创建对象-关系映射文件  3.4.1 映射文件的文档类型定义(DTD)  3.4.2 把Customer持久化类映射到CUSTOMERS表  3.5 通过...

    精通hibernate:对象持久化技术孙卫琴第二版part2

    本章主要介绍关系数据库中的代理主键(不具有业务含义),接着介绍Hibernate提供的几种内置标识符生成器的用法及适用范围。 6.1 关系数据库按主键区分不同的记录 123 6.1.1 把主键定义为自动增长标识符类型 123 ...

    Hibernate注释大全收藏

    通过@SequenceGenerator 和 @TableGenerator 可以配置不同的 identifier 生成器。 table="GENERATOR_TABLE" pk-column-name="key" value-column-name="hi" pk-column-value="EMP" allocation-size="20"/&gt; //...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     3.1 创建Hibernate的配置文件  3.2 创建持久化类  3.3 创建数据库Schema  3.4 创建对象-关系映射文件  3.4.1 映射文件的文档类型定义(DTD)  3.4.2 把Customer持久化类映射到CUSTOMERS表  3.5 通过...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     3.1 创建Hibernate的配置文件  3.2 创建持久化类  3.3 创建数据库Schema  3.4 创建对象-关系映射文件  3.4.1 映射文件的文档类型定义(DTD)  3.4.2 把Customer持久化类映射到CUSTOMERS表  3.5 通过...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     3.1 创建Hibernate的配置文件  3.2 创建持久化类  3.3 创建数据库Schema  3.4 创建对象-关系映射文件  3.4.1 映射文件的文档类型定义(DTD)  3.4.2 把Customer持久化类映射到CUSTOMERS表  3.5 通过...

    精通Hibernate:对象持久化技术第二版part3

    本章主要介绍关系数据库中的代理主键(不具有业务含义),接着介绍Hibernate提供的几种内置标识符生成器的用法及适用范围。 6.1 关系数据库按主键区分不同的记录 123 6.1.1 把主键定义为自动增长标识符类型 123 ...

    Hibernate_Annotation关联映射

    和其它许多批注一样,在多对多关联中很多值是自动生成,党双向多对多关联中没有定义任何物理映射时,Hibernate根据以下规则生成相应的值,关联表名:主表表名+下划线+从表表名,关联到主表的外键名:主表名+下划线+...

    BOS 技术整理

    @OneToMany(mappedBy 相当于 inverse ) @ManyToOne 结合 @JoinColumn 添加一列外键 @ManyToMany 一方写 mappedBy 放弃外键维护、另一方 @JoinTable 维护中间表 收派标准修添加能实现 html 请求 后台...

    java文集

    Java正则表达式 批量上传--采集 (多个文件夹) The Agile Way hibernate mapping文件中的标记详解:关系标记 ANT 安装使用及build.xml文档模板 inverse和cascade在关联更新中的作用 hibernate ...

    Hibernate开发指南

    Hibernate 配置 .............................................................................................. 17 第一段代码 ..............................................................................

    Java面试宝典2010版

    9、hibernate的inverse属性的作用? 13、在DAO中如何体现DAO设计模式? 14、spring+Hibernate中委托方案怎么配置? 15、spring+Hibernate中委托方案怎么配置? 16. hibernate进行多表查询每个表中各取几个字段,也...

    最新Java面试宝典pdf版

    9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各取几...

    Java面试笔试资料大全

    9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各取几...

    JAVA面试宝典2010

    9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各取几...

Global site tag (gtag.js) - Google Analytics