问题描述:
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 张三
hibernate映射数据库表如何使表中字段默认值生效(如更新当传来的值为null时不替换表中值)
最新推荐文章于 2024-07-21 19:43:07 发布