Hibernate 序列乘以 50 生成“@Id”?

mem*_*und 3 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;
Run Code Online (Sandbox Code Playgroud)

这将创建以下架构:

CREATE SEQUENCE my_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1000
  CACHE 1;
Run Code Online (Sandbox Code Playgroud)

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

因此,不知何故,序列的当前值总是乘以50。为什么?我怎样才能防止这种情况并只使用序列中的nexval?

Arn*_*lle 5

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

@SequenceGenerator(name = SEQUENCE, sequenceName = SEQUENCE, allocationSize = 42)
private Long titId;
Run Code Online (Sandbox Code Playgroud)

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

  • 但是 hibernate 应该使用 DB 提供的值,例如如果 hibernate 预订值 1-50 那么它应该使用其中之一。但为什么它会乘以 50 呢? (5认同)