【问题标题】:How to restart PostgreSQL sequences handled by Hibernate?如何重新启动 Hibernate 处理的 PostgreSQL 序列?
【发布时间】:2012-08-17 23:14:41
【问题描述】:

我的任务是重新启动 PostgreSQL 数据库中许多不同串行列的序列。通常,我会简单地使用:

ALTER SEQUENCE serial RESTART WITH 105;

然而,Hibernate 似乎被用于处理数据库序列。我真的对Hibernate一无所知,但我的理解是hibernate_sequence是所有表的全局序列。对吗?

我假设我需要执行以下操作,然后:

ALTER SEQUENCE hibernate_sequence RESTART WITH 105;

但我不确定后果会是什么。假设我有表 A、B、C 和 D。这些表中的每一个都有一个序列类型的 ID 列。上面关于hibernate_sequence的SQL语句会重启所有表的ID列吗?

谢谢!

【问题讨论】:

    标签: hibernate postgresql


    【解决方案1】:

    首先,这里有一个潜在的问题:您将序列的值视为它们的含义。见答案结尾。

    现在,对于 Hibernate,这取决于用户如何配置映射。配置良好的 Hibernate 实例将使用与其他所有实例相同的序列。

    不幸的是,大多数映射都不是很好——或者更确切地说,我认为 Hibernate 的默认行为很糟糕,应该始终被覆盖。使用的默认序列确实是所有表的共享hibernate_sequence。但是,完全有可能让一些表使用它们自己的序列,而其他表使用共享的hibernate_sequence,或者让所有表正确地使用它们自己的序列。

    要获得明确的答案,您需要发布您的映射。

    如果您要更改 ID 生成的表在其 Hibernate 映射中使用正确的表序列,您可以继续并ALTER SEQUENCE 该序列。如果您的映射是通过 JPA 进行的,则使用 @SequenceGenerator@GeneratedValueGenerationType.SEQUENCE 完成。如果它是通过orm.xmlhbm.xml 或旧式 Hibernate 注释完成的,您需要查看手册。或者,如果 Hibernate 是唯一写入数据库的客户端,请查看序列以查看它们是否正在使用 SELECT * FROM sequence_name 上升。

    如果感兴趣的表的映射使用共享的hibernate_sequence,您可能无法在不修复 Hibernate 映射的情况下做您想做的事情。您需要更改映射,以便感兴趣的表的映射使用不同的序列,然后`LOCK TABLE 并将这些序列的起点设置为表中当前最大的行。

    序列:为什么需要更改或重新启动序列?没关系,因为合成主键只是一个无意义的数字,您可以将其与其他无意义的数字进行比较。您要解决的问题是什么?

    【讨论】:

    • 映射是使用 JPA 完成的,因此,例如,所有类(作为表映射到数据库)都有一个“整数 id=-1”,映射定义为“@生成值(策略=GenerationType.SEQUENCE)”。由于数据库中只有一个序列(hibernate_sequence),并且由于所有各种表中的 ID 值之间存在间隙,因此我认为可以安全地假设默认序列在所有人之间共享,正如您所提到的。由于避免数据库传输中的一些冲突,因此需要为所有这些表重新启动序列。
    • @littleK 没问题。希望它有一点帮助。合并数据库……嗯……“有趣”。特别好玩。希望你买了很多杜松子酒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 2020-05-16
    相关资源
    最近更新 更多