Hibernate Envers 4.1.0未生成审计记录问题求助
Hibernate Envers 4.1.0 未生成审计记录的排查与解决
针对你遇到的Wildfly 9.0.2 + Hibernate Envers 4.1.0 + Spring 3.1.0组合下,实体增改正常但AUD表无版本记录的问题,结合你已经完成的排查动作,我给你几个更精准的方向:
1. 聚焦事务同步环节:AuditWorkUnit创建后为何没执行?
你提到AuditWorkUnit创建正常但最终没生成审计记录,核心问题大概率出在事务提交阶段的Envers同步逻辑未触发。可以从这几点深挖:
- 调试
org.hibernate.envers.synchronization.AuditProcess类的doBeforeTransactionCompletion和doAfterTransactionCompletion方法,这两个是Envers写入审计记录的关键回调——如果这两个方法没被调用,说明事务同步器没有正确注册到当前事务中。 - 检查Spring事务配置:确保你用的是
org.springframework.orm.hibernate4.HibernateTransactionManager,并且事务完全由Spring管理,避免Wildfly容器事务和Spring事务双重管理导致的冲突。如果你的代码里混用了容器事务注解(比如@Transactional来自javax.transaction而非Spring的org.springframework.transaction.annotation),也可能导致Envers无法感知事务状态。
2. 检查实体审计注解的完整性
你的实体示例里用了@Audited和@AuditTable,但还有几个细节容易被忽略:
- 父类
BaseEntity是否需要审计?如果父类包含需要追踪的字段,必须给父类也添加@Audited,或者在子类的@Audited注解里加上inheritAudited = true——Envers默认不会继承父类的审计配置。 - 确认主键生成时机:你用了序列生成主键,要确保在事务提交前主键值已经被赋值给实体。虽然Envers 4.1.0已经修复了大部分延迟主键的问题,但如果序列生成逻辑存在延迟,可能导致Envers无法获取有效主键来写入AUD表。
3. 解决Wildfly容器与Hibernate版本的冲突
Wildfly 9.0.2自带的Hibernate版本是4.3.x,而你用的是Envers 4.1.0,版本不匹配很可能导致类加载冲突,出现"监听器注册成功但逻辑执行异常"的假象:
- 你可以在项目根目录添加
jboss-deployment-structure.xml,强制隔离容器自带的Hibernate依赖,让应用使用自己打包的版本:
<jboss-deployment-structure> <deployment> <exclusions> <module name="org.hibernate" /> <module name="org.hibernate.envers" /> </exclusions> </deployment> </jboss-deployment-structure>
4. 验证Envers核心配置是否生效
确认persistence.xml或Spring的Hibernate配置中,关键参数没有被错误覆盖:
- 检查
hibernate.envers.enable是否为true(默认是true,但如果被配置文件意外禁用会直接失效)。 - 如果你没有全局配置审计表后缀,确认
@AuditTable的schema和表名是否和数据库实际存在的表完全匹配(比如大小写是否一致,部分数据库对表名大小写敏感)。
5. 临时验证方案:手动触发审计同步
如果以上排查都没找到问题,可以在事务提交前手动调用Envers的同步逻辑,验证是否能生成审计记录:
import org.hibernate.envers.synchronization.AuditProcess; import org.hibernate.Session; import org.springframework.orm.hibernate4.SessionFactoryUtils; // 在你的Service方法、事务提交前执行 Session session = SessionFactoryUtils.getSession(sessionFactory, true); AuditProcess auditProcess = AuditProcess.getInstance(session); auditProcess.doBeforeTransactionCompletion();
如果手动调用后AUD表成功生成记录,说明问题确实出在事务同步器的注册环节,需要重点排查Spring事务与Hibernate Session的绑定逻辑。
内容的提问来源于stack exchange,提问作者ygorazevedo
相关产品推荐
相关产品推荐

