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

时间:2012-08-17 14:34:17

标签: hibernate postgresql

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

谢谢!

1 个答案:

答案 0 :(得分:4)

首先,这里有一个基础问题:你正在对序列的价值进行处理,就像他们的意思一样。请参阅答案的结尾。

现在,使用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并将这些序列的起点设置为当前表中的最大行。

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