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

迁移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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 17:35:26