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

JPA自定义带前缀ID:初始值设置与INCREMENT_PARAM失效问题

自定义前缀序列ID生成器问题解决方案

问题背景

基于Thorben博客实现的自定义字符串前缀序列生成器,目标生成CUS-60000、CUS-60005、CUS-60010格式的ID,遇到两个问题:

  1. 默认从1开始生成CUS-000001,如何设置非1的初始值?
  2. 配置递增步长为5后,ID仍每次递增1,原因是什么?

问题1:设置初始值

你的生成器继承自SequenceStyleGenerator,底层依赖数据库序列(或Hibernate模拟序列),只需在@GenericGenerator的参数中添加initial_value配置即可指定初始值:

@Parameter(name = "initial_value", value = "60000")

如果使用PostgreSQL/Oracle这类支持原生序列的数据库,Hibernate会自动创建对应初始值的序列;如果是MySQL这类无原生序列的数据库,Hibernate会用hibernate_sequences表模拟,参数直接生效。

问题2:递增步长不生效的原因及解决

你之前的配置没把步长参数传递给父类SequenceStyleGenerator,该类的步长参数名为increment_size(而非你提到的INCREMENT_PARAM,那是Hibernate内部常量名),只需在参数中添加该配置即可:

@Parameter(name = "increment_size", value = "5")

由于你的自定义生成器在configure方法中已经调用了super.configure,父类会处理这个步长参数,生成的序列值就会按5递增。

修改后的完整实体类代码

@Entity
@Table(name = "test")
@Data
public class Test  {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "test_seq")
    @GenericGenerator(name = "test_seq", strategy = "com.xxx.entity.StringPrefixedSequenceIdGenerator", parameters = {
            @Parameter(name = StringPrefixedSequenceIdGenerator.VALUE_PREFIX_PARAMETER, value = "CUS-"),
            @Parameter(name = StringPrefixedSequenceIdGenerator.NUMBER_FORMAT_PARAMETER, value = "%05d"),
            @Parameter(name = "initial_value", value = "60000"),
            @Parameter(name = "increment_size", value = "5")})
    @Column(name = "id", updatable = false, nullable = false)
    private String id;

    private String name;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:42:23