java - 对于 `@Id` 代,Hibernate 序列乘以 50?

标签 java spring hibernate

private static final String SEQUENCE = "my_seq";    

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SEQUENCE)
@SequenceGenerator(name = SEQUENCE, sequenceName = SEQUENCE)
private Long titId;

这将创建以下架构:

CREATE SEQUENCE my_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1000
  CACHE 1;

观察: 当我将序列的 current value 设置为 1 时,自动生成的第一个 @Id50。当我将值设置为 1000 时,第一个 id 是 50000

因此,序列的当前值总是以某种方式乘以 50。为什么?我怎样才能防止这种情况并仅使用序列中的 nexval?

最佳答案

此行为来自 @SequenceGenerator,它的参数 allocationSize 的默认值为 50。如果你愿意,你可以改变它:

@SequenceGenerator(name = SEQUENCE, sequenceName = SEQUENCE, allocationSize = 42)
private Long titId;

这是出于性能原因。它允许 Hibernate 预订一个 ID block ,并防止在您每次需要新 ID 时询问数据库。

关于java - 对于 `@Id` 代,Hibernate 序列乘以 50?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34989290/

相关文章:

spring - 在 Gradle 构建中,启动 Spring Boot 应用程序,运行测试,然后停止 Spring Boot 应用程序

java - 如何在 El Capitan (OS X 10.11) 中设置 Android Studio?

java - 向我的游戏添加第二个关卡

java - Spring -MongoDB

java - Hibernate:在一对多关系中指定列

java - hibernate 或数据库 : Which is better place for foreign key constraints?

java - 使用 JPA 映射弱实体

java - 如果输入无效,为什么 `do-while/for loop` 永远不会结束?

java - 如何在计数器应用程序中继续从共享首选项编号开始计数

java - 当重写 spring 存储库方法而不实现时会发生什么