一尘不染

休眠使用PostgreSQL序列不会影响序列表

hibernate

我已将Hibernate配置为使用PostgreSQL序列(通过注释)为主键 id 列生成值,如下所示:

@Id 
@SequenceGenerator(name="pk_sequence",sequenceName="entity_id_seq")
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="pk_sequence")
@Column(name="id", unique=true, nullable=false)
public int getId() {
    return this.id;
}

通过这种配置,我看到的是,hibernate时,hibernate已经分配了 id 值> 3000,而对已用序列的查询显示了以下内容:

database=# select last_value from entity_id_seq;
last_value 
------------
     69

(1列)

问题:
是否有错?
hibernate状态应该与序列表同步吗?
如果不是,它将在哪里存储最后生成的ID?

谢谢。


阅读 249

收藏
2020-06-20

共1个答案

一尘不染

我有同样的问题。它与Hibernate的id分配策略有关。在不选择 GenerationType.SEQUENCE的情况下
,Hibernate使用HiLo策略,默认情况下以50个块分配ID。因此,您可以像这样显式设置 allocationSize 值:

@Id 
@SequenceGenerator(name="pk_sequence",sequenceName="entity_id_seq", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="pk_sequence")
@Column(name="id", unique=true, nullable=false)
public int getId() {
    return this.id;
}

不过,我也听到过这样的观点,即在 分配大小= 1的 情况下使用HiLo策略不是一个好习惯。有些人建议在必须处理数据库管理的序列时改用
GenerationType.AUTO

更新: 我确实最终使用了分配大小=
1,并且事情似乎按我现在期望的那样工作。我的应用程序使得我真的不需要ID块,所以YMMV

2020-06-20