如何重新启动 Hibernate 处理的 PostgreSQL 序列?

2024-03-10

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

Thanks!


首先,这里有一个潜在的问题:你对待序列的值就像它们意味着什么一样。见答案末尾。

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

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

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

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

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

序列: 你为什么need更改或重新启动顺序?这应该不重要,因为合成主键只是一个无意义的数字,您可以将其与其他无意义的数字进行比较。您想要解决的问题是什么?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何重新启动 Hibernate 处理的 PostgreSQL 序列? 的相关文章

随机推荐