Hibernate inverse的属性介绍

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

inverse是hibernate双向关系中的概念。inverse的作用就是指定由哪一方来维护之间的关联关系。

示例
Stu表

public class Stu implements java.io.Serializable {
    private Integer sid;
    private Stuclass stuclass;
    private String sname;
}
<hibernate-mapping>
    <class name="entity.Stu" table="STU" schema="GC">
        <id name="sid" type="java.lang.Integer">
            <column name="SID" precision="5" scale="0" />
            <generator class="assigned" />
        </id>
        <many-to-one name="stuclass" class="entity.Stuclass" fetch="select">
            <column name="CLASSID" precision="5" scale="0" />
        </many-to-one>
        <property name="sname" type="java.lang.String">
            <column name="SNAME" length="20" />
        </property>
    </class>
</hibernate-mapping>

StuClass表

public class Stuclass implements java.io.Serializable {
    private Integer cid;
    private String cname;
    private Set stus = new HashSet(0);
}
<hibernate-mapping>
    <class name="entity.Stuclass" table="STUCLASS" schema="GC">
        <id name="cid" type="java.lang.Integer">
            <column name="CID" precision="5" scale="0" />
        </id>
        <property name="cname" type="java.lang.String">
            <column name="CNAME" length="20" />
        </property>
        <set name="stus" inverse="false" cascade="save-update">
            <key>
                <column name="CLASSID" precision="5" scale="0" />
            </key>
            <one-to-many class="entity.Stu" />
        </set>
    </class>
</hibernate-mapping>

inverse属性只在一的一方的set标签中有此属性,在多的一方many-to-one标签中无此属性,默认值为inverse=”false”,即由自己一方来维护双方的关系。
举例说明:
当新增一个StuClass对象时,级联新增当前对象里包含的Stu对象

    Session session = HibernateSessionFactory.getSession();
    Transaction tx = session.beginTransaction();
    Stu stu = new Stu(1,"测试");
    Stuclass sc= new Stuclass(10,"一年级");
    sc.getStus().add(stu);
    session.save(sc);
    tx.commit();

hibernate会发出4条sql语句

Hibernate: select stu_.SID, stu_.CLASSID as CLASSID1_, stu_.SNAME as SNAME1_ from GC.STU stu_ where stu_.SID=?
Hibernate: insert into GC.STUCLASS (CNAME, CID) values (?, ?)
Hibernate: insert into GC.STU (CLASSID, SNAME, SID) values (?, ?, ?)
Hibernate: update GC.STU set CLASSID=? where SID=?

第一条是查询新增的Stu对象是否存在
第二条是插入新增的StuClass信息
第三条是插入新增的Stu的信息
因为我们设置了inverse=false,代表由StuClass来维护双方关系,所以新增StuClass对象是,又发出了第四条更新语句来维护双方的关系。

如果把inverse设置为true,代表由另一方来维护。
那么执行代码:

Hibernate: select stu_.SID, stu_.CLASSID as CLASSID1_, stu_.SNAME as SNAME1_ from GC.STU stu_ where stu_.SID=?
Hibernate: insert into GC.STUCLASS (CNAME, CID) values (?, ?)
Hibernate: insert into GC.STU (CLASSID, SNAME, SID) values (?, ?, ?)

只会发出3条语句,那么那条更新的SQL语句的作用是什么呢?
看看数据库:
这里写图片描述
Stu表里classid未插入数据!由于我们保存的StuClass对象里的Stu对象并没有classid的数据,所以新增时为空,而设置了inverse=false的时候,主动方维护了两表的关系,把新增后的Stu对象的空的classid的值更新成了关联表的ID。

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

相关推荐

hibernateinverse详解

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

sunyameng_ndsc的专栏 851

hibernateinverse 详解

以前在刚接触hibernate时,在看到一对多、多对一双向关联映射时,对inverse属性很是纳闷,久久不能理解,现在闲着无事,看了看hibernate,总结一下: 一,我认为,inverse应当是在创建双向关联时,会起到作用,如果只建立单向的关联,没有必要设置此属性。 二,对于(双向关联的)保存来说,如果我们设置了inverse="true",省去执行update的sql语句...

江畔踏雪 315

一对多关联

QQ617923457的专栏 765

hibernateinverse的用法

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

Leader的专栏 2万+

Hibernateinverse属性-详细介绍

这几天,复习Hibernate,没想到还感受了一把“温故而知新”的乐趣,废话少说,“实践才是检验真理的唯一标准” 直接上代码: package com.hibernate.entity; import java.util.HashSet; import java.util.Set; /** * 部门实体类 * @author dabing * */ public class De

开挂的程序猿 1151

Hibernateinverse,cascade属性简单介绍

本篇博客将在上篇双向一对多的情况下介绍inverse,cascade属性的作用 inverse(反转) inverse:指定关联关系的控制方向,默认由one方来维护。在关联关系中,inverse="false"则为主动方,由主动方负责维护关联关系。在一对多关联中,只能设置one方的inverse为true,这将有助于性能的改善。 我先将我的Classes.hbm.xml代码贴出来,(注意:在

韶shls的博客 435

正确理解hibernateinverse属性

1)inverse中提及的side其实是指一个类或者表的概念,双向关联其实是指双方都可以取得对方的应用。 2)维护关系这个名词还是稍显模糊或者晦涩。我们一般说A类或者A表(这里的表的是指多对多的连接表)有责任维护关系,其实这里的意思是说,我在应用在更新,创建,删除(读就不用说了,双向引用正是为了方便读而出现)A类或者A表时,此时创建的SQL语句必须有责任保证关系的正确修改。 3)inverse=...

u014712365的博客 106

hibernate inverse属性

hibernate中描述集合属性时有时候会用到inverse属性,为true时。表示该对象放弃对集合属性的维护,但是对于那些有顺序的集合,比如list 和 array 则不能使用inverse属性,因为他们需要自己来维护对象的关系。 转载于:https://blog.51cto.com/runkityboy/781718...

weixin_34351321的博客 72

Hibernate框架之inverse属性及cascade属性

Hibernate框架之inverse属性及cascade属性一、inverse属性: 1.指定关联关系的控制方向,默认由one方来维护。 2.关联关系中,inverse=“false”则为主动方,由主动方负责维护关联关系。 3.在一对多关联中,只设置one方向的inverse为true,这将有利于性能的改善。二、cascade属性: 1.当设置了ca

huadushao的博客 479

详解Hibernate中cascade与inverse

学习hibernate的时候对级联关系的概念老是分不清楚,尤其是cascade、inverse傻傻分不清。下面通过例子来简单说明

不能说的秘密的博客 1万+

Hibernateinverse属性的应用

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

wqisen's workspace 644

Hibernateinverse属性的用法实战

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

实践求真知 539

hibernate inverse属性的作用

hibernate inverse属性的作用 hibernate配置文件中有这么一个属性inverse,它是用来指定关联的控制方的。 inverse属性默认是false,若为false,则关联由自己控制,若为true,则关联 由对方控制。 见例子: 一个Parent有多个Child,一个Child只能有一个Parent。 package com.xian; publi...

weixin_30709635的博客 147

inverse 与 cascade 属性使用详解、

总结: 在映射一对多的双向关联关系时,应该在“one”方把inverse设为true,这样可以提高性能 关于inverse在one-to-many外键关联(双向关联)中的作用:P.155  孙卫琴-《精通Hibernate:Java对象持久化技术详解》 Order.hbm.xml设置:                                         

小卓在线 815

【SSH三大框架】Hibernate基础第十篇:inverse属性详解

inverse属性详解

u010800530的专栏 1663

hibernate 映射文件 inverse 属性

前两天看了点OA的视频,其中的前二十来集都是在复习Hibernate,很熟悉也很轻松,当然这都是因为有了基础了。不过复习到一个属性inverse的时候,我又把代码实现了一次,主要是觉得挺好。不多说: 下面是对应inverse属性设置以及结果的简单介绍inverse=true的含义:由双向关联另一方维护该关联,己方不维护该关联(只能进行查询操作)。在上述代码中,由Person方维护该关系,示

莫失莫忘-云姐 1171

SSH框架之Hibernateinverse属性、cascade级联操作

一、inverse属性 1、Inverse属性,是在维护关联关系的时候起作用的。 表示控制权是否转移。(只在一的一方起作用(本例中为Dept),多的一方无法使用) <!-- Dept.hbm.xml inverse=false set集合映射的默认值,表示有控制权 --> <set name="emps" inverse="false">

一点一滴 1778

Hibernateinverse和cascade属性

1、inverse:<set>节点的inverse属性指定关联关系的控制方向默认值为true,默认由one放来维护, 关联关系中,inverse="false"则为主动方,由主动方负责维护关联关系,在<set>中设置inverse="false", 关联关系就由多方维护了,但是在一对多关联中,只能设置one放的inverse为true,这将有助于性能的改善, 只有在多对多情况下才会在<set>中设置

吕秀军的博客 296
上一篇: SpringMVC框架入门使用
下一篇: Struts2 使用.do后缀的请求方式
a3226988
博客等级 码龄17年 15粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值