RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1142873
Accepted
Orkhan Hasanli
Orkhan Hasanli
Asked:2020-06-19 01:56:31 +0000 UTC2020-06-19 01:56:31 +0000 UTC 2020-06-19 01:56:31 +0000 UTC

为什么通过flyway迁移数据库时序列没有更新?

  • 772

下面是一个简单的例子: 使用的数据库是 PostgresSQL。使用的堆栈:Spring Boot + Hibernate + FlyWay

@数据

@Entity
@Table(name = "books")
public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long bookId;

    //....
}

这是hibernate生成的表

create table if not exists books
(
  book_id bigserial not null
    constraint books_pkey
      primary key,
  language_id bigint
    constraint fksp7ty25kndaxyfrgkrloo1dd8
      references author
);

用于导入的 sql 查询示例:

INSERT INTO "public"."books" ("book_id", "author_id") VALUES (1,  2);

通过flyway序列的数据迁移后未更新。那些。我应该有超过 200 个对象,并且序列索引显示 1。

SELECT last_value FROM books_book_id_seq;
last_value 0

在这种情况下,例如,对于由 java 脚本初始化的另一个实体,索引会正确显示。问题与此类似: 链接

如果 GenerationType.IDENTITY ,为什么休眠会生成序列?我的错误是什么?

更新

尝试了其他方法 - 更改了 GenerationType.SEQUENCE hibernate created hibernate_sequence 但也将表 DDL 更改为(bigserial -> bigint):

create table if not exists books
(
  book_id bigint not null
    constraint books_pkey
      primary key,
  language_id bigint
    constraint fksp7ty25kndaxyfrgkrloo1dd8
      references author
);

在任何情况下,当通过 flyway 迁移时,该值都不会增加。我可以手动更正此值的最大值。

好吧,既然序列中的值不正确,那么这里就是异常——DataIntegrityViolationException

提前感谢您的回复!

spring
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Roman-Stop RU aggression in UA
    2020-06-19T03:30:08Z2020-06-19T03:30:08Z

    为什么通过flyway迁移数据库时序列没有更新?

    这里对serial/ bigserialtype 如何在postgres.

    如果您在创建条目时未指定值,这种类型将从sequence. 如果该字段的值是显式设置的(就像您创建的迁移一样),那么它会按原样插入,并且不会修改序列。

    您可以通过以下三种方式之一解决此问题。在迁移中创建条目时,您可以:

    1. 不指定book_id自动生成机制工作
    2. 要么手动使用sequence绑定到字段book_id
    3. sequence插入所有记录后手动更新

    考虑这些选项

    不要指定 book_id

    INSERT INTO "public"."books" ("author_id") VALUES (2);
    

    如果需要引用新生成的标识符,可以这样(使用作者的例子):

    INSERT INTO "public"."author" ("name") VALUES ('somebody');
    
    INSERT INTO "public"."books" ("author_id")
    SELECT currval(pg_get_serial_sequence('books', 'author_id'));
    

    手动使用序列

    老实说,该选项没有多大意义,但为了完整起见,我也将其包括在内。请求将如下所示:

    INSERT INTO "public"."books" ("book_id", "author_id")
    SELECT nextval(pg_get_serial_sequence('books', 'book_id')), 2;
    

    插入所有记录后手动更新序列

    SELECT pg_catalog.setval(
             pg_get_serial_sequence('books', 'book_id'),
             (SELECT MAX(book_id) FROM "public"."books") + 1);
    

    如果 GenerationType.IDENTITY 为什么休眠会生成序列

    这里不完全正确。sequence创建 not hibernate,但是postgres。

    IDENTITY表示如果不设置该字段将由数据库自动生成。那些。hibernate在数据库中创建新实体时,它根本不传递此字段。自动生成值是数据库的责任。

    在postgres具有自动生成值的类型中 - serial/ bigserial。里面用到sequence的是一个自动生成的实现细节postgres(毕竟它是自动创建的,大部分情况下用户不需要管它——字段是自动生成的,这是需要的)。这就是为什么这个 sequence没有出现在映射中的任何地方hibernate。

    并且GenerationType.SEQUENCE您需要在映射中明确指定使用哪一个sequence。创建新记录时,hibernate它将使用配置中指定的字段查询数据库以生成该字段的值sequence。然后在执行的时候直接使用这个值INSERT。

    当您将生成器类型更改为 时GenerationType.SEQUENCE,在这种情况下,它hibernate会在数据库中创建另一种类型的字段 - bigint,即 没有自动生成的类型,因为您明确告诉使用sequence.

    • 1

相关问题

  • FindByIndexNameSessionRepository 配置错误“RedisConnectionFactory is required”

  • Spring 如何在百里香模板中输出值?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5