【发布时间】:2020-07-01 16:40:47
【问题描述】:
到目前为止,我正在使用
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
DB中生成的序列是这样的:
CREATE SEQUENCE public.table_name_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER SEQUENCE public.table_name_id_seq OWNED BY public.table_name.id;
ALTER TABLE ONLY public.table_name ALTER COLUMN id SET DEFAULT``nextval('public.table_name_id_seq'::regclass);
或在定义本身的某些地方:
CREATE TABLE "public.table_name" (
"id" int8 NOT NULL DEFAULT nextval('table_name_id_seq'::regclass),
"some_column" varchar(255),
PRIMARY KEY ("id")
);
我使用 hibernate 作为 JPA 提供程序,我需要启用插入和更新批处理,因此我想将生成类型从 IDENTITY 更改为 SEQUENCE。
在更改为生成类型序列 [in hibernate] 并使用旧序列 [of postgres] 后,我看到生成了奇怪的 id。这不是预期的行为。
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "table_name_id_seq ")
private Long id;
以黄色突出显示的 id 是使用生成类型序列后创建的。我期望 23 之后的 id 是 24 而不是 -22。
我该如何解决这个问题?我怎样才能顺利地从 IDENTITY 转移到 SEQUENCE?什么是正确的 DDL?
【问题讨论】:
-
@a_horse_with_no_name ,我认为它不是重复的。我已经去了可能对我没有帮助的帖子的重复。能否请您重新打开它以便其他人可以提供帮助?
-
我有点困惑。如果我错了,请纠正我,但是您想更改数据库以从序列中生成主键值,这是通过您在问题中编写的 ALTER TABLE 命令完成的。
-
身份和序列是hibernate中不同的id生成策略。身份策略使用 db 序列进行 id 生成。但是identity和sequence的策略有着根本的不同,也许sequence策略也使用了db sequence,但它不像identity那样自动递增。
-
您是否尝试过将策略更改为
GenerationTypeSEQUENCE以及 ddl hibernate 为它生成什么?一旦JPA给出了DDL,不就让它从现有数据的最大Id开始吗? -
序列的开始(以及当前)值已更改。请参阅here 获取解决方案
标签: spring postgresql hibernate jpa