升级Spring3.1.1后Hibernate6中@JdbcTypeCode(JSON)审计表插入错误
解决Spring 3.1.1升级后Hibernate Envers审计JSONB字段插入错误
错误原因是Hibernate Envers在生成审计操作时,未正确识别原实体中@JdbcTypeCode(SqlTypes.JSON)的类型映射,导致向jsonb类型字段插入字符串(character varying)类型数据,触发数据库类型不匹配错误。
以下是几种可行的解决方法:
方法一:添加类型处理注解并引入依赖
在实体字段上同时添加@Type注解指定JSON字符串的类型处理器,确保Envers能正确识别字段类型:
@Audited @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @JdbcTypeCode(SqlTypes.JSON) @Type(JsonStringType.class) @Column(columnDefinition = "jsonb") private String payload; // ... 其他字段和方法 }
需要在项目中引入适配Hibernate 6的类型处理依赖(以Maven为例):
<dependency> <groupId>com.vladmihalcea</groupId> <artifactId>hibernate-types-60</artifactId> <version>2.21.1</version> </dependency>
方法二:改用JsonObject类型存储JSON数据
将payload字段类型从String改为Jakarta EE标准的JsonObject,Hibernate会自动适配JSONB类型,Envers也能正确处理审计操作:
import jakarta.json.JsonObject; @Audited @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @JdbcTypeCode(SqlTypes.JSON) @Column(columnDefinition = "jsonb") private JsonObject payload; // ... 其他字段和方法 }
这种方式无需额外引入第三方依赖,适合遵循标准API的场景。
方法三:全局配置Envers的JSON类型映射
通过自定义Hibernate的MetadataContributor,为Envers自动生成的审计表配置全局JSON类型映射:
import org.hibernate.boot.Metadata; import org.hibernate.boot.model.relational.Database; import org.hibernate.boot.spi.MetadataContributor; import org.hibernate.type.SqlTypes; import org.hibernate.type.descriptor.jdbc.JsonbJdbcType; public class EnversJsonMetadataContributor implements MetadataContributor { @Override public void contribute(Metadata metadata) { metadata.getDatabase() .getJdbcEnvironment() .getTypeConfiguration() .getJdbcTypeRegistry() .addDescriptor(SqlTypes.JSON, new JsonbJdbcType()); } }
然后在application.properties中配置该贡献者:
spring.jpa.properties.hibernate.metadata_contributors=com.yourpackage.EnversJsonMetadataContributor
这种方式适合需要统一处理多个实体审计JSON字段的场景。
内容的提问来源于stack exchange,提问作者user1048282
相关产品推荐
相关产品推荐

