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
。
因此,不知何故,序列的当前值始终乘以<{em>乘以50
。为什么?如何防止这种情况,只需使用序列中的nexval?
答案 0 :(得分:4)
此行为来自@SequenceGenerator
,其参数allocationSize
的默认值为50。您可以根据需要进行更改:
@SequenceGenerator(name = SEQUENCE, sequenceName = SEQUENCE, allocationSize = 42)
private Long titId;
这是出于性能原因。它允许Hibernate预订一组id,并防止在每次需要新ID时询问数据库。
答案 1 :(得分:0)
我在Hibernate 5中也遇到了这个问题:
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SEQUENCE)
@SequenceGenerator(name = SEQUENCE, sequenceName = SEQUENCE)
private Long titId;
收到如下警告:
发现已弃用[org.hibernate.id.SequenceHiLoGenerator] 基于序列的id生成器;采用 而是使用org.hibernate.id.enhanced.SequenceStyleGenerator。看到 有关详细信息,请参见《 Hibernate域模型映射指南》。
然后将我的代码更改为SequenceStyleGenerator
:
@Id
@GenericGenerator(name="cmrSeq", strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
parameters = {
@Parameter(name = "sequence_name", value = "SEQUENCE")}
)
@GeneratedValue(generator = "sequence_name")
private Long titId;
这解决了我的两个问题:
1)已弃用的警告已修复 2)现在,根据oracle序列生成了id。