问题描述:
hibernate技术中对应数据库中每一个表,都会有一个映射文件与之对应,此文件描述数据库表中每一个字段的类型、长度、是否可空等属性。在进行表中记录的插入(更新)操作时,hibernate会根据映射文件中的描述自动生成一个包含所有字段的插入(更新)sql语句,此时如果映射文件中某字段的值为空(NULL)而其在数据库表中定义的默认值不为空,hibernate会将空值插入到表中,而不会使用此字段的默认值。
解决方法:
在hibernate映射文件对数据库表的描述中,加入dynamic-insert= "true "和 dynamic-update= "true " 语句,这时hibernate在进行插入(更新)操作时,只会为那些值不为空的字段赋值,而值为空的字段就会使用数据库表中定义的默认值了。
举例说明:
表person:
CREATE TABLE person (
i_id int(11) NOT NULL auto_increment,
c_name varchar(100) NOT NULL default '张三 ',
PRIMARY KEY (id)
)
person.hbm.xml:
<hibernate-mapping package= "cn.com.lough.model ">
<class
name= "Person "
table= "person "
lazy= "false "
>
<meta attribute= "sync-DAO "> true </meta>
<cache usage= "read-write "/>
<id
name= "IId "
type= "integer "
column= "i_id "
>
<generator class= "native "/>
</id>
<property
name= "CName "
column= "c_name "
type= "string "
not-null= "false "
length= "128 "
/>
</hibernate-mapping>
运行程序
Person p = new Person();
HiFactory.save(p);
此时hibernate生成的sql语句为insert into person(c_name) values(null);
数据库表结果为
i_id c_name
1 null
修改person.hbm.xml为:
<hibernate-mapping package= "cn.com.lough.model ">
<class
name= "Person "
table= "person "
lazy= "false "
dynamic-insert= "true "
>
<meta attribute= "sync-DAO "> true </meta>
<cache usage= "read-write "/>
<id
name= "IId "
type= "integer "
column= "i_id "
>
<generator class= "native "/>
</id>
<property
name= "CName "
column= "c_name "
type= "string "
not-null= "false "
length= "128 "
/>
</hibernate-mapping>
再次运行程序,此时hibernate生成的sql语句为 insert into person() values();
数据库表结果为
i_id c_name
1 null
2 张三