对于`@ Id`生成,Hibernate序列乘以50?

时间:2016-01-25 09:40:40

标签: 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

因此,不知何故,序列的当前值始终乘以<{em>乘以50。为什么?如何防止这种情况,只需使用序列中的nexval?

2 个答案:

答案 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。