升级至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
相关产品推荐
相关产品推荐

