我正在使用 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 开始,所以我将 sql 脚本更新为
CREATE SEQUENCE dbo.seq_post START WITH 100 INCREMENT BY 5;
然后我遇到了提到的问题here .我通过那里提到的解决方案修复了它。
这让我想知道,当我希望数据库序列从 1 开始时,为什么这个问题没有发生?基于提到的答案here我希望 id 不会从 1 开始,但这并没有发生。为什么会这样?
最佳答案
首先检查您是否设置了属性 hibernate.id.new_generator_mappings
至 true
作为recomended
你调整是对的 allocationSize
序列为 INCREMENT BY
.
如果你想开始 ID
具有特定值的它似乎遵守以下规则:
以一个开始,将序列设置为
START WITH 1
(这个好像是个异常(exception))开始于
X > 1
设置顺序START WITH X + 50
(实际上X < 1
也是如此)
例如从 5000
开始默认 allocationSize
的 50
定义序列如下
create sequence sub_seq
START WITH 5050
INCREMENT BY 50
NOCACHE;
请注意,我使用的是 NOCACHE
选项,因为我假设 Hibernate 是这个序列的唯一用户,所以缓存 并不是真正有意义的(实际上替换 为分配大小。
你也放松在 session 之间大约。 allocationSize
的 1/2|的 ID
s 并且您不想增加缓存的额外丢失 ID
关于java - 了解 JPA 序列生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67649400/