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

