Hibernate inverse 属性

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
Hibernate一对多双向关联及inverse的作用2007-10-24 16:51在测试Hibernate的一对多双向关联映射时,碰到很有趣的问题,跟inverse属性直接相关。

1、People.hbm.xml

<hibernate-mapping default-lazy="false">
<class name="com.persistent.People" table="people">
<id name="id" column="peopleId" unsaved-value="0">
<generator class="increment">
</generator>
</id>
<property name="name" column="name"></property>
<set name="addresses" cascade="save-update">
<key column="peopleId" not-null="true" />
<one-to-many class="com.persistent.Address"/>
</set>
</class>
</hibernate-mapping>

2、Address.hbm.xml

<hibernate-mapping>
<class name="com.persistent.Address" table="address">
<id name="id" column="addressId" unsaved-value="0">
<generator class="increment">
</generator>
</id>
<many-to-one name="people" column="peopleId" insert="false" update="false"></many-to-one>
<property name="addressName" column="addressName"></property>
<property name="codeNumber" column="codeNumber"></property>
</class>
</hibernate-mapping>
3、People.java和Address.java

public class People ...{
private long id;
private String name;
private Set addresses = new HashSet();
...
}

public class Address ...{
private long id;
private People people;
private String addressName;
private String codeNumber;
...
}

4、数据库结构

people表:{peopleId,name}

address表:{addressId,peopleId,addressName,codeNumber}

5、测试代码

People people = new People();
people.setName("linda");
Address address = new Address();
address.setAddressName("yunnan");
address.setCodeNumber("564123");
address.setPeople(people);
people.getAddresses().add(address);
Session session = HibernateSessionFactory.getSession();
session.beginTransaction();
session.save(people);
session.getTransaction().commit();

6、运行结果

  上面测试代码运行起来正确:

Hibernate: select max(peopleId) from people
Hibernate: select max(addressId) from address
Hibernate: insert into people (name, peopleId) values (?, ?)
Hibernate: insert into address (addressName, codeNumber, peopleId, addressId) values (?, ?, ?, ?)
Hibernate: update address set peopleId=? where addressId=?

  如果将People.hbm.xml映射改写一下:

<set name="addresses" cascade="save-update" inverse="true">
<key column="peopleId" not-null="true" />
<one-to-many class="com.persistent.Address"/>
</set>

  不同之处在于添加了inverse="true",结果:

Hibernate: select max(peopleId) from people
Hibernate: select max(addressId) from address
Hibernate: insert into people (name, peopleId) values (?, ?)
Hibernate: insert into address (addressName, codeNumber, addressId) values (?, ?, ?)

  可以看到,peopleId并没有写入到关联的address当中,数据库address表中相应记录的peopleId字段为空。

7、分析

  在Hibernate中,术语inverse是反转的意思,在关联关系中,inverse="false"为主控方,由主控方负责维护对象的关联关系。所以上面的映射文件改动之后,address为主控方,people为被控方,但是测试代码只进行了一个保存操作session.save(people),这是针对people的,因此无法正确级联保存address。而原来的映射文件中(虽然没有明确指明,Hibernate默认inverse="false"),people为主控方,因此保存people时它会保证关联的address的正确保存。

  也就是说,Hibernate仅仅按照主控方对象的状态的变化来同步更新数据库。按照原来的映射文件,people.getAddresses().add(address),即主控方对象的状态发生了改变,因此数据库会跟着对象状态的变化来同步更新数据库;而address.setPeople(people),即被控方对象的状态发生了改变,它是不能触发对象和数据库的同步更新的。
hibernate一对多,多对一,一对多双向关联 NULL 博文链接:https://huihai.iteye.com/blog/901171 立即下载

相关推荐

CH4Hibernate2,一对多,多对一,多对多实现增删改查

解压导入到你的Myeclipse或者eclipse,更改路径,加入架包

hibernate一对多的实现

昨天我们讲了多对一关系。今天我们就讲讲一对多的实现。 既然多个员工属于一个部门。 那么我们也可以说一个部门有多个员工。   首先我想说,不管是多对一还是一对多,他们的共同点就是两张表有联系。实现的实质就是通过找共同属性的字段(可以不同名字,但是在关联时候,类型是一致的)。 如果是员工表和部门表的话,那么我们可以通过部门编号来实现。   下面我写一个查找一个部门有多少人实例来说明1对多

飞鱼 1091

解决hibernate中session过期问题

1.现象 最近公司的老项目使用的hibernate框架,做单点登陆使用到session,但是登陆以后过一段时间就登录状态失效了,经发现是session过期导致。 2.解决办法 Spring解决hibernate session关闭问题 简单操作就是在web.xml文件里面加入如下配置信息: <filter> <filter-name>openSessionInViewFilter</filter-name> <filter-

zouyang920的博客 544

Hibernate用注解方式实现一对多、多对多关系 代码实现

package com.st.bean4; import java.util.HashSet; import java.util.Set; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistenc...

kaka的博客 723

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的专栏 886

Hibernateinverse属性

**** hibernate配置文件中有这么一个属性inverse,它是用来指定关联的控制方的。 inverse属性默认是false,若为false,则关联由自己控制,若为true,则关联 由对方控制。**** Inverse和cascade是Hibernate映射中最难掌握的两个属性。两者都在对象的关联操作中发挥作用。 1.明确inverse和cascade的作用 inverse 决定是否把对...

DreamChaser_gf的博客 1026

Hibernateinverse属性与cascade属性

  Hibernate集合映射中,经常会使用到"inverse"和"cascade"这两个属性。对于我这样,Hibernate接触不深和语文水平够烂的种种因素,发现这两个属性实在是难以理解,无奈只好将这个两个属性解释工作交给了Google和Baidu,查看了许多牛人的解释,加上自己在Eclipse上的调试,对"inverse"和"cascade"这两个属性有了一定的见解。 "...

alva88888888的博客 250

hibernate中的inverse属性

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

474

hibernate inverse属性

&lt;set name="actSet" table="activity" lazy="false" inverse="true"&gt;         &lt;key column="userId"/&gt;         &lt;element type="integer" column="id"/&gt;   

wzwd111的专栏 140

Hibernate inverse属性介绍

inversehibernate双向关系中的概念。inverse的作用就是指定由哪一方来维护之间的关联关系。示例 Stu表public class Stu implements java.io.Serializable { private Integer sid; private Stuclass stuclass; private String sname; }<hib

铁甲依然在! 624

谈谈Hibernateinverse属性

先看一下这个词的翻译: inverse adj.相反的;逆向的;倒转的 n.相反;倒转;相反的事物 vt.使倒转;使颠倒 乍一看好像跟我们的hibernate里边的inverse属性没有多大的联系…听说是spring里边有个控制反转也是用到这个词,学到再说 好吧我们开始正题 1、inverse是什么? inversehibernate中我的理解是:是否放弃外键维护权… inverse有两种值:...

tiaopimao3185的博客 604

Hibernate--inverse属性与cascade属性

转载:http://www.cnblogs.com/otomedaybreak/archive/2012/01/17/2324772.html Hibernate 集合映射中,经常会使用到"inverse"和"cascade"这两个属性。对于我这样,Hibernate接触不深和语文水平够烂的种种因素,发现这 两个属性实在是难以理解,无奈只好将这个两个属性解释工作交给了Google和...

agt30483的博客 163

Hibernate关于inverse与cascade属性的一些理解

1.inverse 网上关于inverse的理解大都是决定主表还是从表维护关系,但这实在有点抽象,经过进行实验观察sql语句终于有了一下理解。

fengdl123的博客 3124

hibernate中cascade属性inverse属性概念详解

自己在学习hibernate的过程中,一直对cascade属性inverse属性的概念模糊不清,可能很多初学者也会碰到类似情况,主要有以下几个问题: 1、cascade属性inverse属性的作用是什么,即为什么要用他们? 2、在什么情况下使用他们? 3、如何使用他们? 对于hibernate的实体对象的配置,可能时常会用上它们,所以必须将其弄清楚明白, 于是自己通过网上查找资料以及

liuhenglucky的专栏 897

Hibernateinverse属性的应用

inverse为true时表示将主控权交给关联类来执行,在为false时表示由自己来行驶主控权。 inverse属性默认为false,也就是说关系的两端都维护关系。 在一对多映射中,inverse属性多设置为true,也就是说,一对多映射的映射关 系最好由多的一方来维护。 如下所示,为建立的Boy与Girl的关系一对多模型,一个Boy对应多个Girl。 Boy.java packa

wqisen's workspace 644

hibernate 中lazy、inverse、cascade属性

hibernate中一对多关联时会经常用到inverse和cascade属性 ,inverse 有两个值 true ,false  ;如果设置为true 则表示对象的状态变化不会同步到数据库 ;设置false就相反拉;cascade 有五个选项 分别是: all ,delete ,none,save-update,delete-orphan ;        all : 所有情况下均

小伟的程序点滴 积累 739

Hibernateinverse属性的用法实战

一 简介 1 节点的inverse属性指定关联关系的控制方向,默认值为false,表示由one方来维护。 2 关联关系中,inverse="false",表示不反转,为主动方(one方),由主动方负责维护关联关系。 3 在一对多关联中,只能设置one方的inverse为ture,这将有助于性能的改善。   二 配置方法 xml version="1.0"?> DOCTYPE hibe

实践求真知 539
上一篇: Hibernate配置文件中映射元素详解
下一篇: 如何使用Java Singleton模式
meyang
博客等级 码龄22年 4粉丝 0原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值