使用Envers hasChanged()方法报错,需在DB与实体做哪些调整?
问题
尝试从审计表中获取仅当特定列(e_approval_status、e_approval_remark)发生变更时的审计记录,使用Envers的.hasChanged()方法实现,但运行时抛出错误:
java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: e_approval_status_MOD of: com.csi.bm.approval.model.entity.Approval_AUD [select e__ from com.csi.bm.approval.model.entity.Approval_AUD e__ where e__.originalId.id = :_p0 and e__.e_approval_status_MOD = :_p1 and e__.e_approval_remark_MOD = :_p2 order by e__.modifiedDate asc]
编写的代码如下:
AuditReader reader = AuditReaderFactory.get(factory.createEntityManager()); Set<String> userIds = new HashSet<>(); AuditQuery approvalAudit = reader.createQuery() .forRevisionsOfEntity(Approval.class, true, true) .add(AuditEntity.property("id").eq(approvalId)) .add(AuditEntity.property("e_approval_status").hasChanged()) .add(AuditEntity.property("e_approval_remark").hasChanged()) .addOrder(AuditEntity.property("modifiedDate").asc()); List<Approval> approvalList = approvalAudit.getResultList();
已在实体类上添加@Audited注解,并在目标属性上添加@Audited(withModifiedFlag=true)注解,但由于使用Liquibase管理数据库,无法设置ddl-auto为true。尝试手动修改审计表的对应列,但问题仍未解决。请问需在数据库或实体层面进行哪些额外修改才能解决该错误?
解决方案
1. 数据库审计表字段校验与修正
Envers依赖_MOD后缀的布尔字段标记属性是否变更,需确保Approval_AUD表存在以下字段:
e_approval_status_MOD:布尔类型(根据数据库类型选择BIT/TINYINT/BOOLEAN),默认值false,设置非空约束e_approval_remark_MOD:同上述字段要求
若已手动添加,需检查:
- 字段名拼写完全匹配(包括下划线、大小写),无拼写错误
- 字段类型为布尔型,不可用其他类型替代
- 字段已设置非空约束与默认值
false
2. 实体类注解配置确认
- 实体类上的
@Audited注解需正确生效,若存在继承结构,子类需显式添加@Audited避免审计配置丢失 - 目标属性
e_approval_status和e_approval_remark上的@Audited(withModifiedFlag = true)注解参数无误(注意参数名是单数形式withModifiedFlag,复数形式会导致配置失效)
3. Liquibase变更集同步
通过Liquibase编写变更集添加_MOD字段,示例(MySQL):
<changeSet id="add-approval-audit-mod-flags" author="your-author"> <addColumn tableName="Approval_AUD"> <column name="e_approval_status_MOD" type="BOOLEAN" defaultValueBoolean="false" nullable="false"/> <column name="e_approval_remark_MOD" type="BOOLEAN" defaultValueBoolean="false" nullable="false"/> </addColumn> </changeSet>
执行变更集后重启应用,确保Hibernate/Envers加载最新的表元数据
4. Envers全局配置检查
确认项目配置文件中Envers相关配置正确:
- 开启Envers:
hibernate.envers.enabled=true(默认开启,可显式声明) - 若自定义了修改标记后缀(
hibernate.envers.modified_flag_suffix),需确保数据库字段后缀与配置完全一致
5. 审计数据写入验证
触发一次e_approval_status或e_approval_remark的变更操作,查看Approval_AUD表中对应的_MOD字段是否被设为true。若未更新,说明Envers未识别到标记字段,需重新检查表结构与注解配置
内容的提问来源于stack exchange,提问作者Harsha Madhushan
相关产品推荐
相关产品推荐

