gpt4 book ai didi

java - Hibernate使用PostgreSQL序列不影响序列表

转载 作者:IT老高 更新时间:2023-10-28 21:17:26 27 4
gpt4 key购买 nike

我已将 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 已经在持久化时分配了 id 值 > 3000,而对已用序列的查询显示以下内容:

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

(1 行)

问题:
有什么不对吗?
hibernate应该和序列表同步吗?
如果没有,最后生成的id存放在哪里?

谢谢。

最佳答案

我遇到了同样的问题。这与Hibernate的id分配策略有关。当您选择 GenerationType.SEQUENCE 时,Hibernate 使用 HiLo 策略,默认情况下以 50 个 block 为单位分配 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;
}

不过,我也听说过将 HiLo 策略与 allocationSize=1 结合使用并不是一个好的做法。当您必须处理数据库管理的序列时,有些人建议使用 GenerationType.AUTO

更新:我确实最终选择了 allocationSize=1,而且现在似乎一切正常。我的应用程序是这样的,反正我真的不需要 ID block ,所以 YMMV .

关于java - Hibernate使用PostgreSQL序列不影响序列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4288740/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com