You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 08:45:08