我的任务是重新启动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列吗?
谢谢!
答案 0 :(得分:4)
首先,这里有一个基础问题:你正在对序列的价值进行处理,就像他们的意思一样。请参阅答案的结尾。
现在,使用Hibernate,它取决于用户如何配置映射。一个配置良好的Hibernate实例将使用其他所有相同的序列。
不幸的是,大多数映射都不是很好 - 或者说,我认为Hibernate的默认行为很糟糕,应该总是被覆盖。使用的默认序列确实是所有表的共享hibernate_sequence
。但是,完全可以使用自己的序列来使用一些表,使用共享的hibernate_sequence
使用其他表,或者使用自己的序列正确地使用所有表。
要启用明确的答案,您需要发布映射。
如果要更改ID生成的表在其Hibernate映射中使用了正确的表序列,则可以继续ALTER SEQUENCE
该序列。如果您的映射是通过JPA进行的,则使用@SequenceGenerator
和@GeneratedValue
GenerationType.SEQUENCE
进行映射。如果通过orm.xml
,hbm.xml
或旧式Hibernate注释完成,则需要查看手册。或者,如果Hibernate是唯一写入数据库的客户端,请查看序列以查看它们是否正在使用SELECT * FROM sequence_name
。
如果感兴趣的表的映射使用共享的hibernate_sequence
,则在不修复Hibernate映射的情况下,您可能无法执行所需的操作。您需要更改映射,以便感兴趣的表的映射使用不同的序列,然后`LOCK TABLE
并将这些序列的起点设置为当前表中的最大行。
序列:为什么需要更改或重新启动序列?这应该没关系,因为合成主键只是一个无意义的数字,您可以将其与其他无意义的数字进行比较。你试图解决的问题是什么?