升级SpringBoot 3.0后Postgres JSONB无法正常使用的问题
解决Spring Boot 3 + Hibernate 6下Postgres JsonB持久化问题
首先明确:Spring Boot 3完全支持Postgres JsonB,你的问题源于Hibernate 6对类型注解的变更,以及依赖版本不匹配。
核心问题分析
- Hibernate 6弃用了
org.hibernate.annotations.TypeDef和旧的@Type注解,改用新的类型映射方式。 - 你之前尝试混用Hibernate 5.6和Spring Boot 3,由于Spring Boot 3基于Jakarta EE(
jakarta.persistence包),而Hibernate 5.6仍使用Java EE(javax.persistence包),导致接口不兼容报错,这是不可行的。
解决方案一:使用Hibernate 6原生JSON支持(推荐)
Hibernate 6原生支持JSON类型,无需依赖第三方库,直接修改实体类即可:
修改实体类
import jakarta.persistence.Column import jakarta.persistence.Entity import jakarta.persistence.Id import jakarta.persistence.Table import org.hibernate.annotations.JdbcTypeCode import org.hibernate.type.SqlTypes import java.io.Serializable import java.security.SecureRandom import kotlin.math.abs @Entity @Table(name = "myTable") data class RecommendationEntity( @Id open var id: Long = abs(SecureRandom().nextInt().toLong()), // 用@JdbcTypeCode指定JSON类型,配合columnDefinition指定postgres的jsonb @JdbcTypeCode(SqlTypes.JSON) @Column(columnDefinition = "jsonb") var data: MyModel ) data class MyModel( // 你的POJO字段 ) : Serializable
依赖调整
移除旧的第三方类型库依赖:
// 移除这一行 // implementation("com.vladmihalcea:hibernate-types-52:2.21.1")
解决方案二:继续使用vladmihalcea的Hibernate Types库
如果你习惯使用该库,需要升级到适配Hibernate 6的版本:
修改依赖
将hibernate-types-52替换为适配Hibernate 6的hibernate-types-60:
// 替换旧依赖 implementation("com.vladmihalcea:hibernate-types-60:2.21.1") // 可使用最新兼容版本
实体类调整
Hibernate 6中该库的注解用法略有变化,可参考如下写法:
import com.vladmihalcea.hibernate.type.json.JsonBinaryType import jakarta.persistence.Column import jakarta.persistence.Entity import jakarta.persistence.Id import jakarta.persistence.Table import org.hibernate.annotations.JdbcType @Entity @Table(name = "myTable") data class RecommendationEntity( @Id open var id: Long = abs(SecureRandom().nextInt().toLong()), @JdbcType(JsonBinaryType::class) @Column(columnDefinition = "jsonb") var data: MyModel ) data class MyModel( // 你的POJO字段 ) : Serializable
额外注意事项
- 确保Postgres驱动版本兼容Spring Boot 3,你当前使用的
org.postgresql:postgresql:42.5.1是兼容的,无需修改。 - Spring Boot 3默认会管理Hibernate版本,建议移除手动指定的
org.hibernate.orm:hibernate-core依赖,直接使用Spring Boot提供的版本,避免版本冲突:
// 移除这一行 // implementation("org.hibernate.orm:hibernate-core:6.1.7.Final")
内容的提问来源于stack exchange,提问作者Johnny Alpha
相关产品推荐
相关产品推荐

