gpt4 book ai didi

java - Liquibase + Postgresql + Spring Jpa : Id auto increment issue

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

我在实体中有以下 Id 描述:

@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Long id;

生成此 ID 的 Liquibase 指令如下:

  <column name="id" autoIncrement="true"  type="INT">
<constraints nullable="false" primaryKey="true" primaryKeyName="pk_entity"/>
</column>

我也有 liquibase 脚本插入到这个表预定义的值,例如

    <insert tableName="entityTable" schemaName="public">
<column name="id">1</column>
<!- other fields-->
</insert>

当我尝试使用 Jpa 存储库插入没有 id 的新记录时,问题出现了。我收到一条错误消息,如“重复 ID”。所以,我知道 jpa(hibernate) 不使用 postgresql 序列来获取新的 id 值。而且我不想将序列名称包含到实体的 ID 描述中。我希望这种情况可以由 postgresql 本身解决。而且我不会使用'hibernate_sequence'。所以,知道我如何解决这个问题。谢谢。

最佳答案

Liquibase 的指令 autoIncrement="true" 为 PostgreSQL 生成 serial 列。对于 serial 列,PostgreSQL 将创建一个名称类似于 tablename_colname_seq 的序列。将从该序列分配默认列值。

但是当您显式向序列列插入一个值时,它不会影响序列生成器,它的下一个值也不会改变。因此它可以生成重复值,这正是您的情况。

为了防止在插入显式值后发生这种情况,您需要使用 ALTER SEQUENCE 语句或使用 setval() 函数更改序列生成器的当前值,例如:

ALTER SEQUENCE tablename_colname_seq RESTART WITH 42;

SELECT setval('tablename_colname_seq', (SELECT max(colname) FROM tablename));

这应该可以解决问题。

关于java - Liquibase + Postgresql + Spring Jpa : Id auto increment issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44744365/

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