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时,第一个@Id自动生成的是50。当我将值设置为时1000,第一个ID为50000。
current value
@Id
50
1000
50000
于是,不知何故该序列的当前valuze总是得到 成倍 的50。为什么?如何防止这种情况,而只使用序列中的nexval?
此行为来自@SequenceGenerator其参数的默认值50 allocationSize。您可以根据需要进行更改:
@SequenceGenerator
allocationSize
@SequenceGenerator(name = SEQUENCE, sequenceName = SEQUENCE, allocationSize = 42) private Long titId;
这是出于性能原因。它允许Hibernate预订ID块,并防止每次需要新ID时都询问数据库。