(转)Hibernate中inverse的用法

原文:http://blog.youkuaiyun.com/xiaoxian8023/article/details/15380529

一、Inverse是hibernate双向关系中的基本概念。inverse的真正作用就是指定由哪一方来维护之间的关联关系。当一方中指定了“inverse=false”(默认),那么那一方就有责任负责之间的关联关系,说白了就是hibernate如何生成Sql来维护关联的记录! 

       Hibernate仅仅按照主控方对象的状态的变化来同步更新数据库。按照原来的映射文件,people.getAddresses().add(address),即主控方对象的状态发生了改变,因此数据库会跟着对象状态的变化来同步更新数据库;而address.setPeople(people),即被控方对象的状态发生了改变,它是不能触发对象和数据库的同步更新的。

      (实例1):

       举个最简单的一对多父子关系。那么代码就写成:

 

Parent p = new Parent();
Child c = new Child();
c.setParent(p);  //维护父子之间关系
p.getChildren().add(c);

session.save(p);
session.flush();

 

 映射文件配置:

父亲中的关系映射
{set name="children" lazy="true" inverse="true"}
      {key column="parent_id"/}
      {one-to-many class="test.Child"/}
{/set}

儿子中关系映射
{many-to-one name="parent" column="parent_id" not-null="true"/}

 

set中inverse="true",说明父子关系只在多的一端(Child)维护。所以只会发出2个insert语句。

       注意:{many-to-one}总是设成“inverse=false”的,而且这个属性在Mapping中是不存在的!

       这样运行的下来的结果就是:

 

Hibernate: insert into parent (id) values (?)
Hibernate: insert into child (parent_id, id) values (?, ?)

 

如果将set中的inverse设为true,那么会发出3条sql语句,前2条是insert语句,后1条是update语句用来维护parent和child类的父子关系。

       当然,假如c.setParent(p)注释掉(破坏了父子关系),结果就变成了:

 

Hibernate: insert into parent (id) values (?)

 ===================================================
     (实例2):
       一个Person可以参加多个Event,一个Event有多个Person参加。映射文件如下:

 

<!-- Person.hbm.xml -->
<hibernate-mapping package="events">
  <class name="Person" table="person">
      <id name="id" column="person_id">
          <generator class="native"/>
      </id>
      <property name="age" length="0"/>
      <property name="firstname"/>
      <property name="lastname"/>
      <set name="events" table="person_event">
          <key column="person_id"/>
          <many-to-many column="event_id" class="events.Event"/>
      </set>
  </class>
</hibernate-mapping>

<!-- Event.hbm.xml -->
<hibernate-mapping>
  <class name="events.Event" table="events">
      <id name="id" column="event_id">
            <generator class="native"/>
      </id>
      <property name="date" column="events_date" type="timestamp"/>
      <property name="title" column="events_title"/>
      <set name="participants" table="person_event" inverse="true">
          <key column="event_id"/>
          <many-to-many column="person_id" class="events.Person"/>
      </set>
  </class>
</hibernate-mapping>

 inverse=true的含义: 由双向关联另一方维护该关联,己方不维护该关联(只能进行查询操作)。在上述代码中,由Person方维护该<many-to-many>关系,示例代码如下(以向Person参与的Event中加入新的Event为例):

 

 Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Person p = (Person) session.load(Person.class, personId);
        Event e = (Event) session.load(Event.class, eventId);
        p.getEvents().add(e);//执行该代码时,hibernate会向中间表 person_event中插入person_id和event_id记录,如果换成e.getParticipants().add(p)的话,该代码将不会被执行,即hibernate不会向表person_event中插入记录。
        session.getTransaction().commit();

 要注意的一点:在双向关联的关系中,映射的column(和table)的值要一致(即要用相同的表名和列名),不然设置为inverse="true"的这方将失去这个双向关系,而变成了一个单向关联。

       二、Inverse和Cascade的比较

       Inverse:负责控制关系,默认为false,也就是关系的两端都能控制,但这样会造成一些问题,更新的时候会因为两端都控制关系,于是重复更新。一般来说有一端要设为true。

 

       Cascade:负责控制关联对象的级联操作,包括更新、删除等,也就是说对一个对象进行更新、删除时,其它对象也受影响,比如我删除一个对象,那么跟它是多对一关系的对象也全部被删除。
举例说明区别:删除“一”那一端一个对象O的时候,如果“多”的那一端的Inverse设为true,则把“多”的那一端所有与O相关联的对象外键清空;如果“多”的那一端的Cascade设为Delete,则把“多”的那一端所有与O相关联的对象全部删除。

 

 

 

 

 

 

 

 

 

 

JavaEE学习笔记之Hibernate表关系之一对多(inverse详解) 立即下载

相关推荐

tkinter动态表格 - 实时更新数据(TkinterTable)

tkinter动态表格 - 实时更新数据(TkinterTable) 参考 [TkinterTable] Tkinter上的表格GUI】 https://github.com/dmnfarrell/tkintertable/wiki/Usage https://github.com/dmnfarrell/tkintertable/issues/47 python使用tkinter编写一个数据显示窗口(实时显示更新的数据) 首先安装TkinterTable,即pip install tki

qq_33934427的博客 1万+

hibernate中的inverse属性

15、hibernate中的inverse属性 修改街道对应的区道信息: 修改后会发现程序执行了两次修改操作: 原因: 区道与街道是一对多的关系; 由于Hibernate是双向维护外键,所以当修改区道中的街道时,会修改一次外键;在修改街道中的区道时,又会修改一次外键。 这样就会产生效率慢的问题,因为如果执行两次修改,那么第二次是无用的操作。利用inverse属性可以解决这一

无 475

红米12C刷机避坑指南:NV数据损坏的修复与系统版本选择

本文提供了红米12C刷机过程中避免NV数据损坏的详细指南,涵盖系统版本选择、SP刷机工具使用和fastboot命令修复。重点分析了NV数据损坏的原因与表现,并给出通过工程固件和深度修复技巧解决基带未知、IMEI丢失等问题的实操方案,帮助用户安全完成刷机。

cuda7parallel的博客 1075

一对多关联

QQ617923457的专栏 767

Arduino安装图文教程:小白也能轻松上手

手把手带你完成Arduino安装全过程,无论你是编程新手还是硬件小白,都能快速搭建开发环境。结合arduino安装教程与实操步骤,避开常见错误,让创作即刻启程。

weixin_35509395的博客 1107

Power BI应用案例:淘宝用户行为分析实战

一、案例背景 基于千万级的淘宝用户的使用记录,对淘宝用户的行为进行分析,具体指标包括:日PV、日UV、小时PV、小时UV、不同用户行为的PV、用户购买次数分布、用户购买频次分布、活跃用户消费情况等。通过本案例,可以基本看看Power BI都能分析达到怎么样的效果。 二、数据来源及结构 阿里天池官方发布的1万用户在2014年双十二期间的行为记录,数据量达1200万+。 数据下载地址:...

灰哥数据智能的专栏 1万+

hibernate中inverse详解

场景:customer和order 一对多双向关联 public class Order { private Long orderId; private String orderDetail; private Customer customer; public Order(){ } public Order(String orderDetail){ this.orderDetai

sunyameng_ndsc的专栏 853

BMS | 从一串到几百串硬件架构简介

锂电池在生活中越来越多的方面扮演能源的角色,除了大家熟知的电动汽车行业,在一些消费类,工业类电子产品比如手机,电动自行车,电动工具中都有应用,追本溯源今天我们一起来学习下最基础的BMS架构。 1~4串架构 以S8241为代表的无通信/无固件/模拟器件 可实现过充保护、过放保护、过流/短路,参数由器件后缀代码决定;通信类手持设备供电系统;1~4节电池保护板架构 如图使用S-8241系列保护IC,一对充放电MOS管控制充放电的回路的切断和接通,系统供电来自于电芯电压,VM引脚用于检测过...

ningvay的博客 9918

hibernate中inverse的用法

一、Inverse是hibernate双向关系中的基本概念。inverse的真正作用就是指定由哪一方来维护之间的关联关系。当一方中指定了“inverse=false”(默认),那么那一方就有责任负责之间的关联关系,说白了就是hibernate如何生成Sql来维护关联的记录!          Hibernate仅仅按照主控方对象的状态的变化来同步更新数据库。按照原来的映射文件,people

Leader的专栏 2万+

GLMM(广义线性混合模型)原理以及分析步骤

广义线性混合模型(GLMM)是生态与进化研究中处理非正态数据的定制化工具,能同时分析固定效应和随机效应。它通过链接函数连接响应变量与预测因子,支持二项分布、泊松分布等非正态数据。研究流程包括:明确分析目标(固定效应影响与随机效应方差)、选择合适变量与分布、数据验证、参数估算(需根据模型复杂度选择PQL、拉普拉斯近似等方法)及模型优化(检验过离散与残差,通过信息准则或假设检验筛选最优模型)。GLMM能有效解决传统方法无法处理的"伪重复"和推广性问题,为复杂生物数据提供可靠分析框架。

wewil_lwin的博客 4993

5G无线关键技术 — 新型传输波形技术和先进编码与调制技术

目录 1、OFDM传输波形技术 2、滤波器组多载波 (Filterbank multicarrier:FBMC) 3、先进编码与调制技术 4、空间调制(Spatial Modulation SM) 5、频率正交幅度调制 1、OFDM传输波形技术 OFDM是当前Wi-Fi和LTE标准中的高速无线通信的主要传信模式。 LTECP配置 子载波间隔 CP长度Tcp 有用符号长度Tu CP比例..

Fanjufei的博客 2130

Hibernate中的Inverse和cascade属性配置

Inverse和cascade是Hibernate映射中最难掌握的两个属性。两者都在对象的关联操作中发挥作用。 1.明确inverse和cascade的作用  inverse 决定是否把对对象中集合的改动反映到数据库中,所以inverse只对集合起作用,也就是只对one-to-many或many-to-many有效(因 为只有这两种关联关系包含集合,而one-to-one和many-to-on

732

1分钟了解LangChain是什么?

是一个基于大型语言模型(LLM)开发应用程序的框架, 它旨在简化语言模型应用的开发流程,特别是在构建对话系统和其他基于语言的AI解决方案时.目标是将复杂的语言模型技术转化为可通过简单API调用实现的功能,从而使开发者能够更加专注于创造性的解决方案设计。高效地解决了开发大语言模型应用的痛点问题。Langchain 最主要的特色是可以将 LLM 应用研发过程中的交互 Prompt、LLM 模型调用、语言模型与环境互动的自适应等方式融为一体。

gorgor在码农 2630

hibernate中inverse的用法 (转)

转:http://blog.youkuaiyun.com/daniel_tu/article/details/3932078   一、Inverse是hibernate双向关系中的基本概念。inverse的真正作用就是指定由哪一方来维护之间的关联关系。当一方中指定了“inverse=false”(默认),那么那一方就有责任负责之间的关联关系,说白了就是hibernate如何生成Sql来维护关联的记录 ...

suyijianke的博客 140

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

一口一口吃掉Hibernate(八)——Hibernate中inverse的用法

一、Inverse是hibernate双向关系中的基本概念。inverse的真正作用就是指定由哪一方来维护之间的关联关系。当一方中指定了“inverse=false”(默认),那么那一方就有责任负责之间的关联关系,说白了就是hibernate如何生成Sql来维护关联的记录!         Hibernate仅仅按照主控方对象的状态的变化来同步更新数据库。按照原来的映射文件,people.g

崔成龙 . 勇往直前 4万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Hibernate中的cascade、inverse以及mappedBy用法

学习hibernate时对级联关系的概念老是分不清楚,尤其是cascade、inverse以及mappedBy的作用。下面通过例子来简单说明。 准备工作     首先创建数据库,新建两张表:     教室表cr,字段如下     学生表student,字段如下:     教室与学生是一对多的关系。     然后新建项目,添加hibernate支持,由于inverse是hbm

1521

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

inverse java_Hibernate中的inverse的用法

总结:直观来说所有双向关联须有有一段设置为inverse。在一对多的关联中它必须代表多(many)的那端。而在多对多(many-to-many)关联中,可以选取任意一端,因为两端之间并没有差别。以下为转贴:通过Hibernate Inverse的设置来决定是由谁来维护表和表之间的关系。最近有朋友问我Hibernate关于多对多关于删除中间表数据的问题,关键是Inverse的设置,下面引用网友的一篇...

weixin_39867893的博客 217

Hibernate 中 元素的inverse 属性分析

<br />试验背景:<br />表:<br />  create table order_7( id number primary key, order_number varchar2(30), customer_id number) alter table order_7 drop column customer_id alter table order_7 add constraint customer_id_fk customer_id references custom

liuxiIT的专栏 887

hibernate 中inverse

、Inverse是hibernate双向关系中的基本概念。inverse的真正作用就是指定由哪一方来维护之间的关联关系。当一方中指定了“inverse=false”(默认),那么那一方就有责任负责之间的关联关系,说白了就是hibernate如何生成Sql来维护关联的记录           Hibernate仅仅按照主控方对象的状态的变化来同步更新数据库。按照原来的映射文 件,pe

软件的世界 466

Hibernate中cascade和inverse的用法

 记得刚刚接触java的hibernate框架的时候,级联操作中,对cascade和inverse有些茫然,即使是会用,但是也没有明白具体的原理,所以今天写下这篇文章,希望对咱们程序员之家的所以读者有所帮助。1、到底在哪用cascade="..."? cascade 属性并不是多对多关系一定要用的,有了它只是让我们在插入或删除对像时更方便一些,只要在cascade的源头上插入或是删

363

Hibernate 级联关系说明 - 关于cascade和inverse的用法

 在hibernate中一对多关联时会经常用到inverse和cascade属性 ,inverse 有两个值 true ,false  ;如果设置为true 则表示当前对象不负责讲级联对象的状态变化同步到数据库 ;设置false则相反,其默认值为false;cascade 有五个选项 分别是: all ,delete ,none,save-update,delete-orphan

Carol Qian 的专栏 3599
上一篇: Bootstrap学习笔记之Nestable可拖拽树结构
下一篇: (转)Hibernate中inverse的用法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值