5

我的任务是重新启动 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 列吗?

谢谢!

4

1 回答 1

4

首先,这里有一个潜在的问题:您将序列的值视为有意义的东西。请看答案的结尾。

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

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

要启用明确的答案,您需要发布您的映射。

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

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

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

于 2012-08-17T14:48:05.430 回答