问题描述:
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实体映射文件字段设置默认值 在Hibernate框架中,实体映射文件(通常为`.hbm.xml`)用于定义Java对象与数据库表之间的映射关系。这其中包括了属性到数据库表列的映射、主键生成策略、以及一些高级特性...
在IT行业中,XML文件是常用于配置和存储...理解并熟练使用DOM4J对于进行Java XML处理至关重要,尤其是在涉及到如Hibernate这样的持久层框架时。通过不断的实践和学习,开发者可以更好地驾驭XML配置文件,提升开发效率。
- **描述**:用于指定 Hibernate 针对特定关系数据库生成 SQL 语句时使用的方言。不同的数据库可能有不同的 SQL 语法和特性支持,因此正确配置方言至关重要。 - **取值**:应设置为数据库对应的 `org.hibernate....
3. **hibernate.jdbc.batch_versioned_data**:当开启时,Hibernate会为自动版本化的数据使用批量DML操作,以提高性能。 4. **hibernate.jdbc.factory_class**:允许自定义Batcher实现,但大多数情况下无需更改默认...
hibernate.use_identifer_rollback 参数用于如果开启,在对象被删除时生成的标识属性将被重设为默认值。其取值为 true 或 false。 13. hibernate.use_sql_comments hibernate.use_sql_comments 参数用于如果开启,...
这四个概念在处理对象关系映射(ORM)时非常重要,尤其是在Java环境下使用Hibernate框架进行数据库操作时。 ### Hibernate Fetch 模式 在Hibernate中,Fetch模式用于控制关联数据的加载方式。主要有两种取值:`...
10. **JDBC批处理API**: Hibernate底层使用JDBC的批处理API(Statement.addBatch()和Statement.executeBatch()),用户也可以直接使用JDBC批处理,绕过Hibernate的部分逻辑,获取更高的性能。 11. **性能优化注意...
- `hbm2ddl.auto`:设置Hibernate在启动时对数据库表的操作模式,常见的值有`create`(每次启动都重新创建表)、`update`(更新表结构,如果存在则忽略)等。 - `current_session_context_class`:设置当前线程中...
- `hibernate.connection.username`和`hibernate.connection.password`:数据库用户的凭证(在使用JNDI数据源时可选)。 4. **其他可选的Hibernate配置属性**: - `hibernate.dialect`:指定对应数据库的方言,如...
11. **hibernate.use_identifier_rollback**: 开启后,删除对象时,其标识属性会被重置为默认值。 12. **hibernate.use_sql_comments**: 如果设置为`true`,Hibernate将在SQL中添加注释,便于调试。 **Hibernate ...
### hibernate使用c3p0连接池的知识点详解 #### 一、Hibernate与C3P0连接池概述 - **Hibernate**: 是一个全功能的Java持久层框架,它提供了对象关系映射(ORM)功能,使得Java应用可以方便地与数据库进行交互。...
这篇博客"Hibernate学习一--注解方式自动建表"主要探讨了如何使用Hibernate的注解来实现数据库表的自动化创建。 在Java编程中,注解(Annotation)是一种元数据,它提供了在代码中插入信息的方式,这些信息可以被...
对于`hibernate-annotations.jar`来说,这意味着它遵循的可能是Apache License 2.0、LGPL或其他开源许可,这意味着该库可以免费用于商业项目,但需要遵守特定的条款,如保留原有版权信息、公开源代码等。 综上所述...
7. **懒加载(Lazy Loading)**:Hibernate支持延迟加载机制,允许在需要时才加载关联的对象,以提高性能。这通常通过`@OneToMany`、`@ManyToOne`、`@ManyToMany`等注解的`fetch`属性设置。 8. **缓存(Caching)**...
默认值是`property`,意味着Hibernate将使用getter和setter方法来读写属性。如果自定义了访问策略,可以通过实现`PropertyAccessor`接口来指定。 2. `default-lazy`:默认情况下,未显式指定`lazy`属性的Java属性和...
本文主要探讨的是在使用Hibernate框架时遇到的“Hibernate3.4 不自动创建索引的问题”。Hibernate是一个优秀的对象关系映射(ORM)框架,它允许开发者用Java对象的方式来操作数据库,而无需过多关注SQL的细节。然而...
* @GeneratedValue:指定 OID 的生成策略,默认值是 GenerationType.AUTO,相当于 xml 时的 native。 * @Version:映射版本号属性,用于乐观锁。 * @Column:指定属性对应列的信息,包括列名、是否可为空、是否唯一...
- `fetch="select"`:默认值,表示在查询`Emp`时不会立即加载`Dept`,而是通过单独的SQL查询来加载`Dept`。 #### 三、Spring框架下的Hibernate使用案例 在给定的内容中,展示了如何在Spring框架下使用Hibernate。...
- **hilo**:在数据库中建立一张额外的表,默认表名为`hibernate_unique_key`,字段为`next_hi`(比较少用)。 - **assigned**:在插入数据时主键由程序处理,这是默认生成策略,等同于JPA中的`AUTO`。 这些注解...