【发布时间】:2021-08-11 10:05:48
【问题描述】:
我正在使用 spring data JPA 的序列生成器将主键分配给实体。
模型包含:
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_post")
@SequenceGenerator(name = "seq_post", allocationSize = 5)
private Long id;
对应的序列定义(SQL Server DB):
CREATE SEQUENCE dbo.seq_post START WITH 1 INCREMENT BY 5;
由于我想从 100 而不是 1 开始 id,所以我将 sql 脚本更新为
CREATE SEQUENCE dbo.seq_post START WITH 100 INCREMENT BY 5;
然后我遇到了here 提到的问题。我通过那里提到的解决方案修复了它。
这让我想知道,当我希望 DB 序列从 1 开始时,为什么不会发生此问题?根据here 提到的答案,我希望 id 不会从 1 开始,但这不会发生。为什么会这样?
【问题讨论】:
-
因为 Hibernate 足够聪明,不会给出负序号。从这个角度来看,这是一个边缘情况,当你从 1 开始时。
-
不,事实并非如此。我遇到了将负 id 分配为 PK 的情况。
-
好吧,
start with 1似乎是一个独特的例外,对于所有其他值,allocationSize被 减去,所以你是对的,如果你将序列设置为例如start with 3,你会得到第一个ID否定(3-allocationSize) -
其实
Hibernate是开源的,所以应该可以找到new_generator_mappings的源码。你会在那里找到if (nextval == 1) ... else ... subtract allocationSize
标签: java spring-boot hibernate spring-data-jpa