gpt4 book ai didi

Hibernate 为 PostgreSQL 插入生成两个不同的序列 ID

转载 作者:行者123 更新时间:2023-11-29 11:24:51 25 4
gpt4 key购买 nike

我有一个用序列生成的主键定义的实体:

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

我正在使用 PostgreSQL,这个键被定义为一个序列号。根据 PostgreSQL

select last_value from id_key_seq;

返回

1603.

当我执行 create() 来保留该实体的一个实例时,我在我的日志中看到以下内容(不相关的内容已被删除):


05 15:15:26.948 org.hibernate.id.enhanced.SequenceStructure [DEBUG] - 获得的序列值:1604

05 15:15:26.948 org.hibernate.event.def.AbstractSaveEventListener [DEBUG] - 生成的标识符:1554,使用策略:org.hibernate.id.enhanced.SequenceStyleGenerator


随后的 SQL 插入语句引用值 1554,而不是它应该使用的值,1604(基于从 SequenceStructure 返回的值。Hibernate 从哪里得到 1554?

在我看来,Hibernate 在这里有一个错误——SequenceStructure 知道正确的下一个值,但它没有被使用。知道如何解决这个问题吗?

仅供引用:我知道 this page, which says to use GenerationType.AUTO因为“Hibernate 的人完全把这件事搞砸了”,但除了这个不是很有帮助的声明之外,没有太多内容。

最佳答案

看起来如果您使用 GenerationType.SEQUENCE,则需要指定一个“增量值”1,以避免将序列用作高/低种子。

您发布的问题的第一个答案(有用的答案)说明您需要在 @GeneratedValue 注释中指定“allocationSize=1”。

在较新的 Hibernate 版本中,您可以改为在 Hibernate 属性中设置 hibernate.id.new_generator_mappings=true;见the docs .

关于Hibernate 为 PostgreSQL 插入生成两个不同的序列 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4609461/

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