日期:2014-05-18  浏览次数:20681 次

用hibernate时怎么保留默认值
用getHibernateTemplate().save()保存一条记录到表时,字段的默认值无效了,而是为空?添加时我没有set这个字段的值
我用sqlserver的,设置了默认值getdate()

------解决方案--------------------
http://www.jock.org.cn/post/169.htm
------解决方案--------------------
楼上所说的网址的内容:
非常的详细!

问题描述:
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 张三