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

升级至Spring Boot 3.x版本后,PostgreSQL95Dialect替代方案咨询

升级Spring Boot 3.0.2后PostgreSQL95Dialect的替代方案及类型注册处理

1. PostgreSQL95Dialect的替代方案

Spring Boot 3.0.x对应的Hibernate版本为6.x,在Hibernate 6中,PostgreSQL95Dialect及所有版本特定的PostgreSQL方言(如PostgreSQL94Dialect、PostgreSQL10Dialect等)均已被废弃,统一使用**org.hibernate.dialect.PostgreSQLDialect**作为替代。

这个新方言会自动检测连接的PostgreSQL数据库版本,适配对应版本的特性,无需再指定具体版本的方言类。

2. registerHibernateType的处理方式

Hibernate 6中registerHibernateType的使用逻辑发生了变化,结合你用到的StringArrayType、JsonStringType等来自hibernate-types库的类型,有两种可行的处理方式:

方式一:基于Hibernate 6新API修改自定义方言

推荐使用addTypeRegistration方法替代原有的registerHibernateType,修改后的自定义方言代码如下:

import org.hibernate.dialect.PostgreSQLDialect;
import com.vladmihalcea.hibernate.type.array.IntArrayType;
import com.vladmihalcea.hibernate.type.array.StringArrayType;
import com.vladmihalcea.hibernate.type.json.JsonBinaryType;
import com.vladmihalcea.hibernate.type.json.JsonNodeBinaryType;
import com.vladmihalcea.hibernate.type.json.JsonNodeStringType;
import com.vladmihalcea.hibernate.type.json.JsonStringType;

class CustomPostgreSQLDialect extends PostgreSQLDialect {

    public CustomPostgreSQLDialect() {
        super();
        // 注册数组类型
        addTypeRegistration(new StringArrayType().getRegistration());
        addTypeRegistration(new IntArrayType().getRegistration());
        
        // 注册JSON类型
        addTypeRegistration(new JsonStringType().getRegistration());
        addTypeRegistration(new JsonBinaryType().getRegistration());
        addTypeRegistration(new JsonNodeStringType().getRegistration());
        addTypeRegistration(new JsonNodeBinaryType().getRegistration());
    }
}

方式二:通过配置直接注册类型(无需自定义方言)

如果不需要自定义方言的其他逻辑(比如自定义SQL函数),可以直接在配置文件中注册类型,更简洁:

application.properties:

# 注册数组类型
hibernate.types.contribute=com.vladmihalcea.hibernate.type.array.StringArrayType,com.vladmihalcea.hibernate.type.array.IntArrayType
# 追加注册JSON类型
hibernate.types.contribute+=com.vladmihalcea.hibernate.type.json.JsonStringType,com.vladmihalcea.hibernate.type.json.JsonBinaryType,com.vladmihalcea.hibernate.type.json.JsonNodeStringType,com.vladmihalcea.hibernate.type.json.JsonNodeBinaryType

application.yml:

hibernate:
  types:
    contribute:
      - com.vladmihalcea.hibernate.type.array.StringArrayType
      - com.vladmihalcea.hibernate.type.array.IntArrayType
      - com.vladmihalcea.hibernate.type.json.JsonStringType
      - com.vladmihalcea.hibernate.type.json.JsonBinaryType
      - com.vladmihalcea.hibernate.type.json.JsonNodeStringType
      - com.vladmihalcea.hibernate.type.json.JsonNodeBinaryType

此时需要确保项目引入了与Hibernate 6兼容的hibernate-types-60依赖:

<!-- Maven依赖 -->
<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-60</artifactId>
    <version>2.20.0</version>
</dependency>

3. 注意事项

  • 必须使用hibernate-types-60系列版本,旧版hibernate-types-52等与Hibernate 6不兼容。
  • 若仍需自定义方言的其他特性,继承PostgreSQLDialect后,按上述方式调整类型注册逻辑即可。

内容的提问来源于stack exchange,提问作者Vamshi Barana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:09:27