迁移registerFunction与registerHibernateType至Hibernate 6的方法咨询
从Hibernate 5迁移到Hibernate 6:自定义MySQL Dialect适配方案
问题场景
在从Hibernate 5迁移到Hibernate 6时,原有自定义MySQL Dialect代码中的registerFunction和registerHibernateType方法已被移除,原代码如下:
import org.hibernate.dialect.MySQL57Dialect import org.hibernate.dialect.function.SQLFunctionTemplate import org.hibernate.dialect.function.StandardSQLFunction import org.hibernate.type.StandardBasicTypes import org.hibernate.type.StringType import java.sql.Types class CustomMySQLDialect : MySQLDialect(DatabaseVersion.make(5, 70)) { init { registerFunction("group_concat", StandardSQLFunction("group_concat", StringType())) registerFunction("match_against", SQLFunctionTemplate(StandardBasicTypes.DOUBLE, "match (?1) against (?2 in boolean mode)")) registerHibernateType(Types.FLOAT, StandardBasicTypes.DOUBLE.name) registerHibernateType(Types.BIGINT, StandardBasicTypes.LONG.name) registerHibernateType(Types.TINYINT, StandardBasicTypes.LONG.name) registerHibernateType(Types.INTEGER, StandardBasicTypes.LONG.name) registerHibernateType(Types.DECIMAL, StandardBasicTypes.LONG.name) } }
适配Hibernate 6的实现方案
Hibernate 6改用扩展方法来注册函数和类型映射,以下是简便的适配实现:
完整适配代码
import org.hibernate.dialect.MySQLDialect import org.hibernate.dialect.function.SQLFunctionTemplate import org.hibernate.dialect.function.StandardSQLFunction import org.hibernate.type.StandardBasicTypes import org.hibernate.type.descriptor.jdbc.DoubleJdbcType import org.hibernate.type.descriptor.jdbc.LongJdbcType import java.sql.Types import org.hibernate.boot.model.FunctionContributions import org.hibernate.boot.model.TypeContributions import org.hibernate.service.ServiceRegistry class CustomMySQLDialect : MySQLDialect(DatabaseVersion.make(5, 70)) { // 注册自定义SQL函数 override fun initializeFunctionRegistry(functionContributions: FunctionContributions) { super.initializeFunctionRegistry(functionContributions) val registry = functionContributions.functionRegistry // 注册group_concat函数 registry.register( "group_concat", StandardSQLFunction("group_concat", StandardBasicTypes.STRING) ) // 注册match_against自定义模板函数 registry.register( "match_against", SQLFunctionTemplate(StandardBasicTypes.DOUBLE, "match (?1) against (?2 in boolean mode)") ) } // 注册JDBC类型与Hibernate类型的映射 override fun contributeTypes(typeContributions: TypeContributions, serviceRegistry: ServiceRegistry) { super.contributeTypes(typeContributions, serviceRegistry) val jdbcTypeRegistry = typeContributions.typeConfiguration.jdbcTypeRegistry jdbcTypeRegistry.addDescriptor(Types.FLOAT, DoubleJdbcType.INSTANCE) jdbcTypeRegistry.addDescriptor(Types.BIGINT, LongJdbcType.INSTANCE) jdbcTypeRegistry.addDescriptor(Types.TINYINT, LongJdbcType.INSTANCE) jdbcTypeRegistry.addDescriptor(Types.INTEGER, LongJdbcType.INSTANCE) jdbcTypeRegistry.addDescriptor(Types.DECIMAL, LongJdbcType.INSTANCE) } }
关键说明
- 函数注册:通过重写
initializeFunctionRegistry方法,获取FunctionRegistry实例完成函数注册,替代原registerFunction - 类型映射:通过重写
contributeTypes方法,从TypeConfiguration中获取JdbcTypeRegistry,添加JDBC类型对应的Hibernate类型描述符,替代原registerHibernateType - 原有的函数逻辑和类型映射规则完全保留,只是调整了注册方式
内容的提问来源于stack exchange,提问作者Vojtěch
相关产品推荐
相关产品推荐

