[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呢?

posted @ 2013-08-29 17:17  魏朝辉  阅读(3218)  评论(0编辑  收藏  举报