zoukankan      html  css  js  c++  java
  • [Hibernate]dynamic-insert和dynamic-update属性

      这二个属性默认情况均为false,你可以通过以下二种方式进行配置使用:

      1.Annotation

    @Entity
    @Table(name = "stock_transaction", catalog = "mkyong")
    @org.hibernate.annotations.Entity(
            dynamicInsert = true
    )
    public class StockTransaction implements java.io.Serializable {

      2.XML mapping

    <hibernate-mapping>
        <class name="com.triman.bo.SysUser" table="SYS_USER" dynamic-insert="true" dynamic-update="true">
            <id name="id" type="java.lang.String">
                <column name="ID" length="36" />
                <generator class="uuid.hex" />
            </id>
            <property name="username" type="java.lang.String">
                <column name="USERNAME" length="30" not-null="true" unique="true" />
            </property>
            <property name="name" type="java.lang.String">
                <column name="NAME" length="30" not-null="true" />
            </property>
    </hibernate-mapping>

    一、dynamic-insert属性

      设置dynamic-insert="true"属性,hibernate在生成insert语句时,会过滤过值为null的属性。

    以上图中SysUser.hbm.xml所示,当dynamic-insert=false时

    SysUser user=new SysUser();
    user.setName("abc");
    session.save(user);

    在执行此段程序时,会生成sql语句为:

    Hibernate: 
        INSERT 
        INTO
            SysUser
            (id,username,name) 
        VALUES
            (?, ?, ?);

    当dynamic-insert="true"时,生成的sql语句为:

    Hibernate: 
        INSERT 
        INTO
            SysUser
            (id,name) 
        VALUES
            (?, ?);

    Hibernate生成语句时,对值为null的属性不进行转换。

    二、dynamic-update属性

      设置dynamic-update="true"属性,hibernate在生成update语句时,会过滤过值为null的属性。

    当dynamic-update="false"时,即默认选项:

    Query q = session.createQuery("from SysUser where id = :userId ");
       q.setParameter("userId", "1");
       SysUser user =(SysUser)q.list().get(0);
       user.setName("张三");
       session.update(user);

    执行上段程序,生成的sql语句为:

    Hibernate: 
        UPDATE
            SysUser
        SET
            USERNAME=?,
            NAME=? 
        WHERE
            ID=?

    当dynamic-update=true时,Hibernate生成的语句不包含没有被修改的字段:

    Hibernate: 
        UPDATE
            SysUser
        SET
            NAME=? 
        WHERE
            ID=?

    三、总结

      在某种情况下,如一张表中含有上百个字段,或是表中含有大数据字段,添加dynamic-insert=true和dynamic-update=true属性,insert/update时生成语句时回避一些未涉及的字段,提升系统执行性能。既然能提升性能,Hibernate为什么不把默认值设为true呢?

  • 相关阅读:
    UI自动化测试(五)TestNG简介与安装步骤
    selenium webdriver 右键另存为下载文件(结合robot and autoIt)
    SpringBoot系列之日志框架介绍及其原理简介
    SpringBoot系列之profles配置多环境(篇二)
    SpringBoot系列之Spring容器添加组件方式
    MySQL基础之自连接用法简介
    MySQL基础之Natural Join用法
    MySQL基础之STRAIGHT JOIN用法简介
    SpringBoot系列之配置文件加载位置
    SpringBoot系列之外部配置用法简介
  • 原文地址:https://www.cnblogs.com/bingya/p/3289566.html
Copyright © 2011-2022 走看看