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

Hibernate 6自定义序列式ID生成器适配:LongType弃用解决方案

Hibernate 6 自定义序列式ID生成器实现(解决LongType弃用问题)

Hibernate 6 中org.hibernate.type.LongType已被移除,导致原Hibernate 5版本的自定义序列ID生成器报错。以下是适配Hibernate 6的实现方案:

修改后的代码实现

import org.hibernate.HibernateException;
import org.hibernate.MappingException;
import org.hibernate.boot.model.TypeConfiguration;
import org.hibernate.id.enhanced.SequenceStyleGenerator;
import org.hibernate.internal.util.config.ConfigurationHelper;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.type.BasicType;
import org.hibernate.type.Type;
import org.hibernate.type.spi.SharedSessionContractImplementor;
import java.io.Serializable;
import java.util.Properties;

public class StringPrefixedSequenceIdGenerator extends SequenceStyleGenerator {

    public static final String VALUE_PREFIX_PARAMETER = "valuePrefix";
    public static final String VALUE_PREFIX_DEFAULT = "";
    private String valuePrefix;

    public static final String NUMBER_FORMAT_PARAMETER = "numberFormat";
    public static final String NUMBER_FORMAT_DEFAULT = "%d";
    private String numberFormat;

    @Override
    public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException {
        Long sequenceValue = (Long) super.generate(session, object);
        return valuePrefix + String.format(numberFormat, sequenceValue);
    }

    @Override
    public void configure(Type type, Properties params, ServiceRegistry serviceRegistry) throws MappingException {
        // 从TypeConfiguration中获取Long类型,替代已弃用的LongType.INSTANCE
        TypeConfiguration typeConfiguration = serviceRegistry.getService(TypeConfiguration.class);
        Type longType = typeConfiguration.getBasicTypeRegistry().resolve(BasicType.LONG);
        
        super.configure(longType, params, serviceRegistry);
        
        valuePrefix = ConfigurationHelper.getString(VALUE_PREFIX_PARAMETER, params, VALUE_PREFIX_DEFAULT);
        numberFormat = ConfigurationHelper.getString(NUMBER_FORMAT_PARAMETER, params, NUMBER_FORMAT_DEFAULT);
    }
}

关键改动说明

  • 替换弃用类型:通过TypeConfiguration的基础类型注册表获取Long类型实例,适配Hibernate 6的类型体系变化,替代原LongType.INSTANCE。
  • 明确类型转换:在generate方法中显式将父类返回值转为Long,避免隐式转换带来的类型风险,符合序列生成的数值特性。
  • 保留业务逻辑:完整保留原有的前缀配置、数字格式化逻辑,确保业务行为与Hibernate 5版本一致。

实体类注解用法(与Hibernate 5兼容)

在实体类的ID字段上使用Hibernate扩展注解配置生成器:

import jakarta.persistence.Id;
import jakarta.persistence.GeneratedValue;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;

@Id
@GenericGenerator(
    name = "prefix_sequence",
    strategy = "com.example.StringPrefixedSequenceIdGenerator",
    parameters = {
        @Parameter(name = "sequence_name", value = "entity_seq"),
        @Parameter(name = "valuePrefix", value = "ENT_"),
        @Parameter(name = "numberFormat", value = "%05d")
    }
)
@GeneratedValue(generator = "prefix_sequence")
private String id;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 15:44:53