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

Envers与Hibernate 6.3.1不审计带有@Column(insertable=false, updatable=false)注解字段的问题咨询

Envers与Hibernate 6.3.1不审计带有@Column(insertable=false, updatable=false)注解字段的问题咨询

你遇到的这个情况其实是Hibernate 6.x版本里Envers的预期行为变更,不是bug哦,我给你理清楚来龙去脉:

问题场景回顾

你定义的实体字段配置如下:

@Generated(GenerationTime.INSERT)
@Column(insertable = false, updatable = false)
private Integer number;

同时实体标注了@Audited注解,在Spring Boot 2.7(Hibernate 5.6)版本时,审计表能正常记录这个字段的生成值,但升级到Spring Boot 3.x(Hibernate 6.x,包括3.1和3.2对应的版本)后,审计表中该字段就变成NULL了,且测试发现把insertable改为true后就恢复正常。

背后的原因

在Hibernate 6.x中,Envers调整了字段审计的判断逻辑:对于标记为insertable = false的字段,Envers默认会判定这类字段不需要被审计——因为insertable=false的本意就是告诉ORM层:这个字段的值不需要由应用代码插入,而是由数据库(比如序列、触发器)生成维护。

但这里的矛盾点在于,你希望主表依赖数据库生成值,同时审计表能同步记录这个生成后的结果,而Envers的新逻辑刚好忽略了这类字段的审计。

可选的解决方案

  • 自定义Envers审计策略:可以编写自定义的审计策略,覆盖Envers对insertable=false字段的判断逻辑,强制让它审计这类字段。
  • 业务层面约束替代注解限制:去掉insertable=false,改用业务代码约束(比如把字段的setter设为私有,或者在业务层加校验)来避免手动设置该字段的错误,这样Envers就能正常审计该字段的生成值了。
  • 手动同步审计上下文:在实体插入成功后,手动将生成的number值同步到Envers的审计上下文里,不过这种方式比较繁琐,不推荐作为首选。

补充说明

这个行为变更在Hibernate 6.0的官方变更记录里有提及,核心是Envers现在更严格地对齐ORM层的字段属性配置,减少不必要的审计操作,避免和主表的字段策略产生冲突。

备注:内容来源于stack exchange,提问作者vap78

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 11:18:00