双向关联产生多余的SQL语句

/**
* 添加一个订单到id为6的客户中
*/
@Test
public void fun1(){
Session session = HibernateUtils.getSession();
session.getTransaction().begin(); try {
Customer cst = session.get(Customer.class, 6); Order od = new Order();
od.setDetail_id(UUID.randomUUID().toString()); cst.getOds().add(od);
} catch (Exception e) {
session.getTransaction().rollback();
// TODO Auto-generated catch block
e.printStackTrace();
} session.getTransaction().commit();
}

 

这是Hibernate生成的语句:

Hibernate:
    select
        customer0_.cust_id as cust_id1_0_0_,
        customer0_.cust_name as cust_nam2_0_0_,
        customer0_.cust_gender as cust_gen3_0_0_,
        customer0_.cust_age as cust_age4_0_0_,
        customer0_.cust_phone as cust_pho5_0_0_
    from
        customera customer0_
    where
        customer0_.cust_id=?
Hibernate:
    select
        ods0_.cust_order_id as cust_ord3_1_0_,
        ods0_.order_id as order_id1_1_0_,
        ods0_.order_id as order_id1_1_1_,
        ods0_.detail_id as detail_i2_1_1_,
        ods0_.cust_order_id as cust_ord3_1_1_
    from
        ordersa ods0_
    where
        ods0_.cust_order_id=?
Hibernate:
    insert
    into
        ordersa
        (detail_id, cust_order_id, order_id)
    values
        (?, ?, ?)
Hibernate:
    update
        ordersa
    set
        cust_order_id=?
    where
        order_id=?
很容易发现,对于外键属性,cust_order_id,hibernate进行了两次维护,即进行了两次更新,这明显对性能有影响。如何减少这类SQL语句的生成,就得用到inverse了。

如何会有两次维护外键的语句生成?

  因为双向维护关系,而且持久态对象可以自动更新数据库,更新客户的时候会修改一次外键,更新订单的时候同样也会修改一次外键。这样就会产生了多余的SQL。

解决方法:

  只需要将一方放弃外键维护权即可。也就是说关系不是双方维护的,只需要交给某一方去维护就可以了。通常我们都是交给多的一方去维护的,为什么呢?因为多的一方才是维护关系的最好的地方,举个例子:一个老师对应多个学生,一个学生对应一个老师,这是典型的一对多。那么一个老师如果记住了所有学生的名字是很难得,但如果让每个学生记住老师的名字应该不难。所以在一对多中,一的一方都会放弃外键的维护权(关系的维护)。这个时候如果想让一的一方放弃外键的维护权只需要

  在一的一方中有如下配置(customer.hbm.xml)

  

<!-- 配置一对多属性 -->
<set name="ods" cascade="save-update" inverse="true">
<key column="cust_order_id"></key>
<one-to-many class="Order"/>
</set>

  再次执行上述java的添加订单的代码

  Hibernate:
    select
        customer0_.cust_id as cust_id1_0_0_,
        customer0_.cust_name as cust_nam2_0_0_,
        customer0_.cust_gender as cust_gen3_0_0_,
        customer0_.cust_age as cust_age4_0_0_,
        customer0_.cust_phone as cust_pho5_0_0_
    from
        customera customer0_
    where
        customer0_.cust_id=?
Hibernate:
    select
        ods0_.cust_order_id as cust_ord3_1_0_,
        ods0_.order_id as order_id1_1_0_,
        ods0_.order_id as order_id1_1_1_,
        ods0_.detail_id as detail_i2_1_1_,
        ods0_.cust_order_id as cust_ord3_1_1_
    from
        ordersa ods0_
    where
        ods0_.cust_order_id=?
Hibernate:
    insert
    into
        ordersa
        (detail_id, cust_order_id, order_id)
    values
        (?, ?, ?)

明显SQL少了一句。

inverse的默认值是false,代表不放弃外键维护权,配置值为true,代表放弃了外键的维护权。(让对方来维护)

Hibernate入门(十)inverse的更多相关文章

  1. Hibernate入门(十二)离线条件检索

    Hibernate——离线条件检索DetachedCriteria DetachedCriteria翻译为离线条件查询,因为它是可以脱离Session来使用的一种条件查询对象,我们都知道Criteri ...

  2. Hibernate入门5持久化对象关系和批量处理技术

    Hibernate入门5持久化对象关系和批量处理技术 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv 前言: 前面学习了Hiberna ...

  3. Hibernate(十六):Hibernate二级缓存

    Hibernate缓存 缓存(Cache):计算机领域非常通用的概念.它介于应用程序和永久性数据存储源(如磁盘上的文件或者数据库)之间,起作用是降低应用程序直接读取永久性数据存储源的频率,从而提高应用 ...

  4. 走进JavaWeb技术世界13:Hibernate入门经典与注解式开发

    原文地址:Hibernate入门这一篇就够了 前言 本博文主要讲解介绍Hibernate框架,ORM的概念和Hibernate入门,相信你们看了就会使用Hibernate了! 什么是Hibernate ...

  5. 三大框架之hibernate入门

    hibernate入门   1.orm      hibernate是一个经典的开源的orm[数据访问中间件]框架           ORM( Object Relation Mapping)对象关 ...

  6. Hibernate入门案例及增删改查

    一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private I ...

  7. Android入门(十二)SQLite事务、升级数据库

    原文链接:http://www.orlion.ga/610/ 一.事务 SQLite支持事务,看一下Android如何使用事务:比如 Book表中的数据都已经很老了,现在准备全部废弃掉替换成新数据,可 ...

  8. Hibernate入门案例 增删改

    一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private I ...

  9. Hibernate入门6.Hibernate检索方式

    Hibernate入门6.Hibernate检索方式 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv Hibernate的整体框架已经 ...

随机推荐

  1. weblogic 与项目jar冲突解决方案 ITsm部署

    部署时出现找不到类itims*****IMOType 时删除   2个fvsd-res-ws-1.0.ja,itims-fvsd-res-sync.jar jar包 里面的DeviceInfoPort ...

  2. JAVA RSA加密AES加密

    RSA加密: import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import javax.crypto.Cipher; imp ...

  3. Jenkins 定时构建语法规则

    1.Jenkins自由风格任务定时构建 2.语法规则 定时构建语法 * * * * * 第一个*表示分钟,取值0~59 第二个*表示小时,取值0~23 第三个*表示一个月的第几天,取值1~31 第四个 ...

  4. Pycharm永久激活方式

    1.首先下载pycharm破解包 http://idea.lanyus.com/ 2. 将下载的文件放入PyCharm安装bin目录下: 3.在pycharm.exe.vmoptions ,pycha ...

  5. MySQL-5.7.19 在阿里云 CentOS-7.0 上的安装

    工具准备 查看系统是否安装了yum工具: [root@wangbo srv]# rpm -qa | grep yum yum-metadata-parser-1.1.4-10.el7.x86_64 y ...

  6. Python开发网站目录扫描器

    有人问为什么要去扫描网站目录:懂的人自然懂 这个Python脚本的特点: 1.基本完善 2.界面美观(只是画了个图案) 3.可选参数增加了线程数 4.User Agent细节处理 5.多线程显示进度 ...

  7. Python Tkinter 简单使用

    简单的一些实例,能够实现一般的功能就够用了 Tkinter: 创建顶层窗口: # -*- coding: utf-8 -*- from Tkinter import *   root = Tk() r ...

  8. SpringMVC框架三:参数绑定

    这篇文章整合了SpringMVC和MyBatis: https://www.cnblogs.com/xuyiqing/p/9419144.html 接下来看看参数绑定: 默认Conrtroller可以 ...

  9. 从字节码看java类型转换【 深入理解 (T[]) new Object[size] 】

    我们都知道,java中对类型的检查是很严格的,所以我们平操作时,也往往很小心. 如题: (T[]) new Object[size],这种写法是一般我们是不会干的!但是有点经验的同学,还是会遇到这样写 ...

  10. Mysql主从配置实战

    实战mysql主从配置 准备两个docker容器,分别在3306和3307开启两个mysql为主从数据库 可执行以下命令 docker run -p 3306:3306 --name mysql330 ...