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

Spring Boot 3中PostgreSQL JSONB及TypeDef注解失效问题

解决方案:Spring Boot 3 + PostgreSQL JSONB适配

一、使用Hibernate 6内置支持(推荐,无需额外依赖)

Spring Boot 3集成的Hibernate 6已原生支持PostgreSQL的JSONB类型,无需引入第三方hibernate-types依赖。

1. 映射Map类型字段

移除原有的@TypeDef和@Type注解,改用@JdbcTypeCode指定SQL类型:

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.type.SqlTypes;
import java.util.Map;

@Getter
@Setter
@Entity
@Table(name = "parameters")
public class Parameter {
    @Id
    @Column(name = "id", nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(name = "character", columnDefinition = "jsonb")
    @JdbcTypeCode(SqlTypes.JSON)
    private Map<String, Object> character;
}

2. 映射自定义POJO类型

若要映射自定义POJO(如CharacterInfo),需确保POJO实现Serializable接口,再配合@JdbcTypeCode使用:

// 自定义POJO类
@Data
public class CharacterInfo implements Serializable {
    private String name;
    private Integer level;
    // 其他字段按需添加
}

// 实体类中引用
@Column(name = "character", columnDefinition = "jsonb")
@JdbcTypeCode(SqlTypes.JSON)
private CharacterInfo character;

二、继续使用Hibernate Types库(仅兼容场景)

若坚持使用第三方hibernate-types库,需做以下调整:

  1. 引入适配Hibernate 6的依赖:
    <!-- Maven依赖 -->
    <dependency>
        <groupId>com.vladmihalcea</groupId>
        <artifactId>hibernate-types-60</artifactId>
        <version>2.21.1</version>
    </dependency>
    
  2. 修改注解用法:
    Hibernate 6废弃了@Type(type = "...")的字符串参数写法,需直接指定类型类:
    import com.vladmihalcea.hibernate.type.json.JsonBinaryType;
    import jakarta.persistence.*;
    import lombok.Getter;
    import lombok.Setter;
    import org.hibernate.annotations.Type;
    import org.hibernate.annotations.TypeDef;
    import java.util.Map;
    
    @Getter
    @Setter
    @Entity
    @Table(name = "parameters")
    @TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
    public class Parameter {
        @Id
        @Column(name = "id", nullable = false)
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Integer id;
    
        @Type(value = JsonBinaryType.class)
        @Column(name = "character", columnDefinition = "jsonb")
        private Map<String, Object> character;
    }
    

关键变化说明

Spring Boot 3升级到Hibernate 6后,原Hibernate 5中@Type(type = "...")的写法被废弃,官方推荐使用原生@JdbcTypeCode注解或直接指定类型类。同时Hibernate 6原生支持JSON类型映射,无需依赖第三方库即可完成适配。

内容的提问来源于stack exchange,提问作者Jure Beton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 06:45:07