zoukankan      html  css  js  c++  java
  • Hibernate的dynamic-insert和dynamic-update的使用

    Hibernate在初始化的时候,默认按照配置为表预定义insert,delete,update,select(by id)的SQL语句放在session中,其中insert,update,select操作都是对表的所有字段操作.如果在一个表有很多字段的时候,在做初次inser的时候有比较多的字段为空值,或者经常update某少部分字段,应该在配置文件的<class>元素上将dynamic-insert和dynamic-update设置为true.其默认值都为false.

    如有这样一张表:

    create table hbtest(id int,val1 varchar2(100),val2 varchar2(100));

    1,在 dynamic-insert没有设置的时候

    <class name="com.test.hb.dynamicupdate.Hbtest" table="HBTEST">
    
                Hbtest tbo = new Hbtest();
                tbo.setId(new Integer(2));
                tbo.setVal1("val1");
    
                sessionFactory.getCurrentSession().save(tbo);

    某些字段为空做insert,hibernate会用全字段的insert sql语句,如下:

    insert into HBTEST(VAL1, VAL2,ID) values(?, ?,?)

    2,将dynamic-insert设置为true,同样的保存,hibernate会动态生成SQL语句,没有值的字段不会出现在insert语句中.

    <class name="com.test.hb.dynamicupdate.Hbtest" dynamic-insert="true" table="HBTEST">
    
    insert into HBTEST(VAL1, ID) values(?, ?)

    3,在 dynamic-update没有设置的时候

     Hbtest tbo = (Hbtest) sessionFactory.getCurrentSession().load(Hbtest.class,new Integer(1));            
                tbo.setVal1("valXX");            
                tx.commit();

    只更新部分字段,hibernate仍然对所有字段做更新:

    update HBTEST set VAL1=?,VAL2=? where ID=?

    4,同样的操作如果把设置为true的话,sql语句只包含更新的字段:

    update HBTEST set VAL1=? where ID=?
    
    <class name="com.test.hb.dynamicupdate.Hbtest" dynamic-insert="true" dynamic-update="true" table="HBTEST">

    5,Hibernate这种动态SQLupdate的特性是利用在对象从数据库加载到hibernate session的时候保存了一份快照,做更新的时候与这个快照做比较,只更新改动过的值.

    所以下面这种情况就会用全部字段进行更新:,不设值的字段会被更新成null.   

      Hbtest tbo = new Hbtest();
                tbo.setId(new Integer(1));
                tbo.setVal1("val1ZZZ");
                sessionFactory.getCurrentSession().update(tbo);    

    这种情况应该利用Hibernate提供的对SQL的支持,用SQL做更新操作.

  • 相关阅读:
    用Python操纵文件(自动化脚本的第一步)
    关于Numpy Array的使用技巧整理
    有用的在线小工具汇总
    HackerRank刷题之路---Python
    周志华老师《机器学习》复习要点(持续更新)
    Python函数式编程学习笔记
    Supervised Descent Method学习之路(持续更新)
    HackerRank刷题之路之---Algorithm(基于Python2)(持续更新)
    Vim常用命令精简化汇总及Vim的相关配置问题
    在VC++6.0中,如何将多个工程添加到同一个工作区?
  • 原文地址:https://www.cnblogs.com/fuyuanming/p/5843036.html
Copyright © 2011-2022 走看看