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

Spring Boot 3.2.3自定义序列ID生成器实现启动报错求助

问题解决:启动错误修复 + 带bill_前缀的自定义主键生成器实现

一、启动错误原因及修复

你遇到的AbstractMethodError是Hypersistence Utils与Hibernate版本不兼容导致的:Hibernate 6.4.x对BasicPluralJavaType接口新增了resolveType方法,但你使用的Hypersistence Utils版本未实现该方法。

修复方案

更新Hypersistence Utils到适配Hibernate 6.4的版本(最低3.6.0):

  • Maven依赖:
<dependency>
    <groupId>io.hypersistence</groupId>
    <artifactId>hypersistence-utils-hibernate-62</artifactId>
    <version>3.6.0</version>
</dependency>
  • Gradle依赖:
implementation 'io.hypersistence:hypersistence-utils-hibernate-62:3.6.0'

如果项目中没有用到Hypersistence Utils的功能,直接移除该依赖即可彻底解决冲突。

二、实现带bill_前缀的自定义序列生成器(适配Hibernate 6.x/Spring Boot 3.x)

1. 自定义生成器类

继承Hibernate的SequenceStyleGenerator,实现前缀拼接逻辑:

import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.enhanced.SequenceStyleGenerator;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.type.Type;

import java.util.Properties;

public class BillPrefixSequenceGenerator extends SequenceStyleGenerator {

    public static final String PREFIX_PARAM = "prefix";
    private static final String DEFAULT_PREFIX = "bill_";

    private String prefix;

    @Override
    public void configure(Type type, Properties params, ServiceRegistry serviceRegistry) {
        super.configure(type, params, serviceRegistry);
        // 读取配置的前缀,默认使用bill_
        prefix = params.getProperty(PREFIX_PARAM, DEFAULT_PREFIX);
    }

    @Override
    public Object generate(SharedSessionContractImplementor session, Object object) {
        // 获取序列生成的数字ID
        Long sequenceId = (Long) super.generate(session, object);
        // 拼接前缀返回字符串主键
        return prefix + sequenceId;
    }
}

2. 实体类中配置使用

将主键类型设为String,并指定自定义生成器:

import jakarta.persistence.*;

@Entity
@Table(name = "bills")
public class Bill {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "bill_seq_generator")
    @GenericGenerator(
            name = "bill_seq_generator",
            type = BillPrefixSequenceGenerator.class,
            parameters = {
                    @Parameter(name = "sequence_name", value = "bill_sequence"), // 数据库序列名称
                    @Parameter(name = "initial_value", value = "1"), // 初始值
                    @Parameter(name = "increment_size", value = "1"), // 步长
                    @Parameter(name = BillPrefixSequenceGenerator.PREFIX_PARAM, value = "bill_") // 自定义前缀
            }
    )
    private String id;

    // 其他业务字段、getter/setter方法
}

3. 数据库序列准备

如果Hibernate未自动创建序列(取决于spring.jpa.hibernate.ddl-auto配置),手动在数据库中创建:

-- 以PostgreSQL为例,其他数据库方言语法略有不同
CREATE SEQUENCE bill_sequence START WITH 1 INCREMENT BY 1;

注意事项

  • 主键类型必须为String,因为最终生成的是带前缀的字符串
  • 若使用Spring Boot,可通过spring.jpa.hibernate.ddl-auto=update让Hibernate自动生成序列
  • 确保Hibernate方言配置正确,适配你的数据库类型

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:41:03