首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解JPA序列发生器

理解JPA序列发生器
EN

Stack Overflow用户
提问于 2021-05-22 12:21:42
回答 1查看 1.3K关注 0票数 3

我使用spring的序列生成器为实体分配主键。

模型包括:

代码语言:javascript
复制
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_post")
@SequenceGenerator(name = "seq_post", allocationSize = 5)
private Long id;

相应的序列定义(用于Server ):

代码语言:javascript
复制
CREATE SEQUENCE dbo.seq_post START WITH 1 INCREMENT BY 5;

因为我想从100而不是1开始I,所以我将sql脚本更新为

代码语言:javascript
复制
CREATE SEQUENCE dbo.seq_post START WITH 100 INCREMENT BY 5;

然后,我遇到了这里提到的问题。我用上面提到的解决办法解决了这个问题。

这让我想知道,当我希望DB序列从1开始时,为什么这个问题不会发生呢?根据提到的这里的答案,我希望ids不会从1开始,但不会发生。为什么是这种情况?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-11 15:04:15

首先,检查是否将属性hibernate.id.new_generator_mappings设置为true复述

而不是用序列allocationSize来调整INCREMENT BY

如果您想使用特定的值启动ID,那么它似乎遵循以下规则:

  • 首先,将序列设置为START WITH 1 (这似乎是一个例外)
  • X > 1开始,设置START WITH X + 50序列(当然,X < 1也是如此)

例如,从5000开始,使用默认的allocationSize of 50,定义序列如下

代码语言:javascript
复制
create sequence sub_seq
       START WITH 5050
       INCREMENT BY 50
       NOCACHE;

请注意,我使用的是NOCACHE选项,因为我假设Hibernate是这个序列的唯一用户,因此缓存不是真实的满的(实际上是用分配大小替换的)。

您还可以在会话之间放松大约。allocationSize的1/2,您不希望增加缓存的IDs的额外损失。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67649400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档