hibernate添加数据,默认字段为null的问题解决

本文深入探讨了使用Hibernate时遇到的一个常见问题:数据库字段默认值与动态SQL配置之间的相互作用。通过详细解释如何在*.hbm.xml文件中调整配置参数,如dynamic-insert和dynamic-update,以确保字段默认值正确应用。文章还提供了实例代码,帮助开发者避免常见的错误,并优化SQL语句执行效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库中的一个字段默认为0,但是在用hibernate的添加之后,默认字段竟然不是0,为NULL.
查了一下.发现想要让默认字段生效.需要在*.hbm.xml添加一些参数,如下.(红色部分)

dynamic-insert="true" dynamic-update="true">
..............



下面是网上搜集的有关其它配置的说明

Hibernate允许我们在映射文件里控制insert和update语句的内容.比如在映射文件中
1)元素 insert属性:设置为false,在insert语句中不包含这个字段,表示永远不会被插入,默认true
2)元素 update属性:设置为false,在update语句中不包含这个字段,表示永远不会被修改,默认true
3)元素 mutable属性:设置为false就是把所有的元素的update属性设置为了false,说明这个对象不会被更新,默认true
4)元素 dynamic-insert属性:设置为true,表示insert对象的时候,生成动态的insert语句,如果这个字段的值是null就不会加入到insert语句当中.默认false
5)元素 dynamic-update属性,设置为true,表示update对象的时候,生成动态的update语句,如果这个字段的值是null就不会被加入到update语句中,默认false
6)元素 dynamic-insert属性:设置为true,表示把所有的元素的dynamic-insert属性设置为true,默认false
7)元素 dynamic-update属性:设置为true,表示把所有的元素的dynamic-update属性设置为true,默认false

Hibernate生成动态SQL语句的消耗的系统资源(比如CPU,内存等)是很小的,所以不会影响到系统的性能,如果表中包含N多字段,建议把dynamic-update属性和insert属性设置为true,这样在插入和修改数据的时候,语句中只包括要插入或者修改的字段.可以节省SQL语句的执行时间,提高程序的运行效率.

### Hibernate 自动记录审计字段的实现方式 在 Hibernate 中,可以通过多种方法实现自动记录审计字段的功能。以下是基于 `Hibernate Envers` 和 `JPA 审计注解` 的两种常见实现方式。 #### 方法一:使用 Hibernate Envers 实现审计功能 Hibernate Envers 是一个专门用于实体版本管理和审计的工具。它可以自动追踪实体的变化并存储历史记录。要启用此功能,需完成以下配置: 1. **引入依赖** 需要在项目的构建文件中添加 Hibernate Envers 的依赖项。 ```xml <!-- Maven --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-envers</artifactId> <version>{hibernate-version}</version> </dependency> ``` 2. **启用 Envers 功能** 在应用的配置文件中开启 Envers 支持: ```properties spring.jpa.properties.org.hibernate.envers.audit_table_suffix=_AUD spring.jpa.properties.org.hibernate.envers.store_data_at_delete=true ``` 3. **定义可审计实体** 使用默认设置时,只需标注实体类即可使其成为可审计对象。 ```java import jakarta.persistence.Entity; import org.hibernate.envers.Audited; @Entity @Audited public class User { private Long id; private String name; private String email; // Getters and Setters } ``` 4. **查询审计数据** 可以通过 `AuditReader` 查询特定时间点的数据状态或变更历史。 ```java AuditReader auditReader = AuditReaderFactory.get(entityManager); List<Number> revisions = auditReader.getRevisions(User.class, userId); for (Number rev : revisions) { User userAtRev = auditReader.find(User.class, userId, rev); System.out.println("Revision " + rev + ": " + userAtRev.getName()); } ``` 上述过程展示了如何利用 Hibernate Envers 记录全字段的历史变化[^3]。 --- #### 方法二:使用 JPA 审计注解实现自动化审计 如果仅需要记录简单的创建时间和更新时间戳,则可以借助 Spring Data JPA 提供的内置支持。 1. **引入依赖** 如果尚未集成 Spring Boot 或 Spring Data JPA,请先确保其已正确配置。 2. **启用审计功能** 添加全局配置以激活审计特性。 ```java import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @Configuration @EnableJpaAuditing public class AuditingConfig {} ``` 3. **定义审计字段** 在实体类中声明所需的审计字段,并使用相应的注解标记它们。 ```java import jakarta.persistence.Entity; import jakarta.persistence.Temporal; import jakarta.persistence.TemporalType; import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedBy; import org.springframework.data.annotation.LastModifiedDate; import java.util.Date; @Entity public class Product { @CreatedBy private String createdBy; @CreatedDate @Temporal(TemporalType.TIMESTAMP) private Date createdDate; @LastModifiedBy private String lastModifiedBy; @LastModifiedDate @Temporal(TemporalType.TIMESTAMP) private Date lastModifiedDate; // Other fields, getters, setters... } ``` 4. **自定义 AuditorAware 接口** 为了动态获取当前用户的名称或其他上下文信息,需实现 `AuditorAware` 接口。 ```java import org.springframework.data.domain.AuditorAware; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import java.util.Optional; public class SecurityAuditorAware implements AuditorAware<String> { @Override public Optional<String> getCurrentAuditor() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication == null || !authentication.isAuthenticated()) { return Optional.empty(); } return Optional.of(authentication.getName()); } } ``` 以上步骤实现了基本的时间戳和用户信息的自动填充功能[^2]。 --- #### 性能优化建议 当处理大量数据时,应考虑性能影响。例如,启用了二级缓存能够有效降低数据库负载。 ```properties spring.jpa.properties.hibernate.cache.use_second_level_cache=true spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.jcache.JCacheRegionFactory ``` 这有助于提升读取效率,尤其是在频繁访问审计表的情况下[^4]。 --- ### 结论 无论是选择 Hibernate Envers 还是 JPA 注解的方式,都可以满足不同场景下的审计需求。前者适合复杂的版本管理与全面的历史记录,而后者则更适用于轻量级的时间戳和操作者信息记录。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值