gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:29:01 27 4
gpt4 key购买 nike

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

ALTER SEQUENCE serial RESTART WITH 105;

但是,似乎正在使用 Hibernate 来处理数据库序列。我真的对Hibernate一无所知,但我的理解是hibernate_sequence是所有表的全局序列。对吗?

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

ALTER SEQUENCE hibernate_sequence RESTART WITH 105;

但我不确定结果会怎样。假设我有表 A、B、C 和 D。这些表中的每一个都有一个类型为 serial 的 ID 列。上面关于 hibernate_sequence 的 SQL 语句会重新启动所有表的 ID 列吗?

谢谢!

最佳答案

首先,这里有一个潜在的问题:您将序列的值视为它们具有某种意义。请参阅答案的结尾。

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

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

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

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

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

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

关于hibernate - 如何重新启动 Hibernate 处理的 PostgreSQL 序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12007793/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com