JPA自定义带前缀ID:初始值设置与INCREMENT_PARAM失效问题
自定义前缀序列ID生成器问题解决方案
问题背景
基于Thorben博客实现的自定义字符串前缀序列生成器,目标生成CUS-60000、CUS-60005、CUS-60010格式的ID,遇到两个问题:
- 默认从1开始生成
CUS-000001,如何设置非1的初始值? - 配置递增步长为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
相关产品推荐
相关产品推荐

