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做更新操作.

时间: 2024-11-07 17:29:04

Hibernate的dynamic-insert和dynamic-update的使用的相关文章

Hibernate三种状态,缓存,以及update更新问题

一. Hibernate中对象的三种状态 1. 瞬时状态(transient) 当我们通过Java的new关键字来生成一个实体对象时,这时这个实体对象就处于自由状态,此时该对象只是通过JVM获得了一块内存空间,还并没有通过Session对象的save()方法保存进数据库,因此也就还没有纳入Hibernate的缓存管理中,也就是说该对象现在还自由的游荡于Hibernate缓存管理之外.所以我们可以看出自由对象最大的特点就是,在数据库中不存在一条与它对应的记录. 瞬时状态特点: I: 不和 Sess

Only Link: What&#39;s the difference between dynamic dispatch and dynamic binding

http://stackoverflow.com/questions/20187587/what-is-the-difference-between-dynamic-dispatch-and-late-binding-in-c http://programmers.stackexchange.com/questions/200115/what-is-early-and-late-binding/200123#200123 Only Link: What's the difference betw

MongoDB中insert方法、update方法、save方法简单对比

MongoDB中insert方法.update方法.save方法简单对比 1.update方法 该方法用于更新数据,是对文档中的数据进行更新,改变则更新,没改变则不变. 2.insert方法 该方法用于插入数据到文档中,也就是给文档添加新数据. 3.save方法 该方法同样用于插入数据到文档中,功能是类似于insert方法的.与insert方法不同的是, save方法是遍历文档,逐条将数据插入进去的,而insert方法是将整个文档整体插入进去的. 由两个方法的源码可以看出来. save方法的写法

【MyBatis源码分析】insert方法、update方法、delete方法处理流程(上篇)

打开一个会话Session 前文分析了MyBatis将配置文件转换为Java对象的流程,本文开始分析一下insert方法.update方法.delete方法处理的流程,至于为什么这三个方法要放在一起说,是因为: 从语义的角度,insert.update.delete都是属于对数据库的行进行更新操作 从实现的角度,我们熟悉的PreparedStatement里面提供了两种execute方法,一种是executeUpdate(),一种是executeQuery(),前者对应的是insert.upda

javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: ResultSet is from UPDATE. No Data.

Java jpa调用存储过程,抛出异常如下: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: ResultSet is from UPDATE. No Data. at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1361) at org.hiberna

Hibernate中Session的save()、update()、merge()、lock()、saveOrUpdate()和persist()方法的区别

Hibernate的对象有三种状态,分别是:瞬时态(transient).持久态(persistent).游离态(detached) 1.瞬时态的实例可以通过调用save().persist()或者saveOrUpdate()方法变成持久态 2.游离态的实例可以通过调用 update().saveOrUpdate().lock()或者replicate()方法变成持久态 3.save()和update()方法的区别在于前者是将瞬时态对象变成持久态,后者是将游离态对象变成持久态 4.merge()

【MongoDB】The basic operation of Mongodb, Insert\Query\Delete\Update

1, Insert MongoDB is database storing document object, the type of which is called Bson.(like JSON); Example:  // document defination Now after using command[db.posts.insert(doc)], you will insert record successfully if seeing the The following pictu

8.INSERT INTO 语句 UPDATE 语句

1. INSERT INTO 语句 INSERT INTO 语句用于向表格中插入新的行. 语法 INSERT INTO 表名称 VALUES (值1, 值2,....) INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing') 我们也可以指定所要插入数据的列: INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....) INSERT INTO Persons

转: Hibernate HQL查询 插入 更新(update)实例

1.实体查询:有关实体查询技术,其实我们在先前已经有多次涉及,比如下面的例子:String hql=”from User user ”;List list=session.CreateQuery(hql).list();上面的代码执行结果是,查询出User实体对象所对应的所有数据,而且将数据封装成User实体对象,并且放入List中返回.这里需要注意的是,Hibernate的实体查询存在着对继承关系的判定,比如我们前面讨论映射实体继承关系中的Employee实体对象,它有两个子类分别是 Hour

Hibernate HQL查询 插入 更新(update)实例

1.实体查询:有关实体查询技术,其实我们在先前已经有多次涉及,比如下面的例子:String hql=”from User user ”;List list=session.CreateQuery(hql).list();上面的代码执行结果是,查询出User实体对象所对应的所有数据,而且将数据封装成User实体对象,并且放入List中返回.这里需要注意的是,Hibernate的实体查询存在着对继承关系的判定,比如我们前面讨论映射实体继承关系中的Employee实体对象,它有两个子类分别是 Hour