【问题标题】:How to migrate [DDL] from generation type identity to generation type sequence for postgres db如何将 [DDL] 从生成类型标识迁移到 postgres db 的生成类型序列
【发布时间】: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


【解决方案1】:

回答你的这部分问题:

如何才能顺利地从IDENTITY 切换到SEQUENCE?什么是正确的 DDL?

你应该做以下事情:

  1. table_name.id 列中删除默认值:
alter table only table_name
alter column id drop default;
  1. 更正id 字段的映射:
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "my_generator")
@SequenceGenerator(name = "my_generator", sequenceName = "table_name_id_seq", allocationSize = 1)
private Long id;

请注意allocationSize 应该等于序列定义的INCREMENT BY

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 2014-06-30
    • 2021-08-30
    • 2010-09-12
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    相关资源
    最近更新 更多