为什么我的 Spring 引导实体 ID 生成失败?

Why is my Spring Boot entity ID generation failing?

我正在尝试为我的实体自动生成 ID,但它没有生成。相反,当我的数据库中已经存在 ID 为“1”的条目时,它从 1 开始。为什么它没有为我的新实体生成 ID“9”?

通常在 postgres 上使用 GenerationType.IDENTITY 创建 table 时,Hibernate 将设置 id 列加上 数据库序列 来管理此 id。

按照惯例,序列名称将是“tablename_id_seq”。例如,对于 table ad_group_action 会有相应的序列 ad_group_action_id_seq。您可以连接到数据库以仔细检查创建的实际序列名称。

序列从 1 开始,每次 Hibernate 插入一行时递增。

但是如果有预先存在的行——或者如果具有现有 ID 的行被插入 "manually" 到 table——这些行可能与序列冲突。

一个解决方案是简单地重置序列(从 pgAdmin 或其他数据库客户端)以从更高的数字(比如 100)开始,使用类似的东西:

ALTER SEQUENCE ad_group_action_id_seq RESTART WITH 100;

现在 Hibernate 不会与现有行冲突(假设它们的最大 ID < 100)。

或者,当手动插入行时,省略 id 列并让 postgres 自动设置它们。这样 table 和序列将始终同步。