2012-08-17 79 views
5

我的任务是重新启动PostgreSQL数据库中许多不同的串行列的序列。通常,我会简单地使用:如何重新启动由Hibernate处理的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列?

谢谢!

回答

4

首先,这里有一个潜在的问题:你正在处理序列的价值,就像它们意味着什么。看到答案的结尾。

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

不幸的是,大多数映射不是很好 - 或者说,我认为Hibernate的默认行为是可怕的,应该总是被覆盖。所有表使用的默认序列确实是共享的hibernate_sequence。但是,完全有可能使用它们自己的序列和其他使用共享的hibernate_sequence的表,或者使所有表正确使用它们自己的序列。

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

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

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

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

+0

映射是用JPA完成的,例如,所有类(映射到数据库的表格)都有一个“Integer id = -1”,映射定义为“@GeneratedValue(strategy = GenerationType 。序列)”。由于数据库中只有一个序列(hibernate_sequence),并且由于所有不同表中的ID值之间存在差距,所以我认为可以安全地假设默认序列是在所有共享序列之间共享的,如前所述。由于避免了数据库传输中的一些冲突,因此需要为所有这些表重新启动序列。 – littleK 2012-08-17 15:02:47

+0

再次感谢您的帮助,非常翔实。 – littleK 2012-08-17 15:03:34

+1

@littleK没问题。希望它有一点帮助。合并数据库......嗯......“有趣”。特别有趣。希望你买了很多很多的杜松子酒。 – 2012-08-17 15:15:09

相关问题