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">
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">
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">
小结:
倘若我们更新或插入数值时,数据库中的有些字段不允许为空。而插入或更新时,我们没有注意,忘记给这些字段填值了,肯定会报错。举个例子:添加时或更新,如果忘记给不为空的字段填值,肯定会报错。而如果,添加了dynamic-insert="true"dynamic-update="true" 即:<class name="com.test.hb.dynamicupdate.Hbtest" dynamic-insert="true" dynamic-update="true" table="HBTEST">此时更新或插入数据时,不允许为空的字段及时我们没有手动设置值,它也会有一个默认值。这样就不会报错了。