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库,需做以下调整:
- 引入适配Hibernate 6的依赖:
<!-- Maven依赖 --> <dependency> <groupId>com.vladmihalcea</groupId> <artifactId>hibernate-types-60</artifactId> <version>2.21.1</version> </dependency> - 修改注解用法:
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
相关产品推荐
相关产品推荐

