Hibernate 5迁移至6.2时Envers自定义修订表类型转换异常求助
解决方案:Hibernate 6 Envers 保留 RevisionType 序号存储行为
问题根源
Hibernate 6 对 Envers 的 RevisionType 枚举默认存储策略从序号(0/1/2)改为了枚举名称(ADD/MOD/DEL),导致原有存储的数值与新映射逻辑不匹配,触发类型转换异常。单纯添加 @Enumerated 注解无效,因为 Envers 对该字段有专属映射处理逻辑,会覆盖 JPA 注解配置。
最优解决方案(全局配置,无需修改实体)
在 Hibernate 配置文件(如 hibernate.properties、persistence.xml 或 Spring Boot 的 application.properties)中添加以下全局配置项:
# 强制RevisionType按序号存储(对应原Hibernate 5行为) hibernate.envers.revision_type_storage=ORDINAL
该配置是 Hibernate 6 新增的专属参数,全局生效,无需修改任何实体代码,完美适配700个实体的场景。
备选方案(自定义转换器)
如果全局配置无法生效,可通过自定义属性转换器强制映射逻辑,且自动应用到所有 RevisionType 字段:
import jakarta.persistence.AttributeConverter; import jakarta.persistence.Converter; import org.hibernate.envers.RevisionType; @Converter(autoApply = true) public class RevisionTypeConverter implements AttributeConverter<RevisionType, Byte> { @Override public Byte convertToDatabaseColumn(RevisionType revisionType) { return revisionType == null ? null : (byte) revisionType.ordinal(); } @Override public RevisionType convertToEntityAttribute(Byte dbData) { if (dbData == null) { return null; } return RevisionType.values()[dbData.intValue()]; } }
autoApply = true 会让转换器自动作用于所有实体中的 RevisionType 字段,无需逐个实体添加 @Convert 注解。
验证方法
配置完成后,重新开启 org.hibernate.orm.jdbc.bind 的 TRACE 日志,若看到类似如下日志,说明配置生效:
[TRACE] [http-nio-8080-exec-3] org.hibernate.orm.jdbc.bind - binding parameter [10] as [TINYINT] - [0]
内容的提问来源于stack exchange,提问作者Mançaux Pierre-Alexandre
相关产品推荐
相关产品推荐

