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

升级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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:07:05