hibernate在初始化的时候,默认按照配置为表预定义insert,delete,update,select(by id)的sql语句放在session中,其中insert,update
hibernate在初始化的时候,默认按照配置为表预定义insert,delete,update,select(by id)的sql语句放在session中,其中insert,update,select操作都是对表的所有字段操作.如果在一个表有很多字段的时候,在做初次inser的时候有比较多的字段为空值,或者经常update某少部分字段,应该在配置文件的元素上将dynamic-insert和dynamic-update设置为true.其默认值都为false.
如有这样一张表:create table hbtest(id int,val1 varchar2(100),val2 varchar2(100));
1,在 dynamic-insert没有设置的时候
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语句中.
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=?
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做更新操作.
,