【发布时间】:2012-08-30 10:55:20
【问题描述】:
我注意到我的 PostgreSQL 数据库中的 hibernate_sequence 很有趣。到目前为止,该序列(我的数据库中的所有表都使用)一直递增 1。然而,情况不再如此。
目前,hibernate_sequence 显示的值为 43270。如果我 SELECT nextval('hibernate_sequence'); 它将正确报告 43271。
但是,当我将数据插入表中时,序列 ID 现在是 1872053!
对于我的一生,我不知道为什么,但它影响了我运行的一些数据库脚本,这些脚本每晚在不同环境之间传输数据。
我希望它与以下文章没有任何关系,该文章指出声明 @GeneratedValue(strategy=GenerationType.SEQUENCE)“使用 HiLo 策略,默认情况下以 50 个块为单位分配 ID。”
Hibernate use of PostgreSQL sequence does not affect sequence table
如果是这样,序列 ID 会有这么大的跳跃吗?从43271 到1872053?
就好像与 hibernate_sequence 有“断开连接”。当我插入第二个事件时,ID 为 1872053,但 hibernate_sequence 值不再变化(仍将保持在 43421)。
还有其他可能的解释吗?
谢谢!
代码示例:
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE)
private Integer id;
【问题讨论】:
-
您应该向我们展示源代码。但是,是的,序列策略使用 HILO 算法。
-
我只是觉得奇怪的是 hibernate_sequence 不再改变?它在 43271 处是静态的。插入新数据后它不会更新。然而,新数据似乎在某种序列上,例如 1872053、1872054、1872055 等。另外,为什么序列号会跳得这么高?
-
这就是 HILO 算法的工作原理:它增加序列一次,然后能够进行 N 次插入,直到它重新增加序列你没有向我们展示源代码,所以也可能是Hibernate 没有使用你认为它应该使用的序列。
-
谢谢。我对休眠并不是很熟悉,但是我在原始问题中发布了一些示例代码。您是否正在寻找任何特定的东西(某些配置文件等)?我在我的项目中搜索了“hibernate_sequence”,但什么也没找到。
-
hibernate_sequence是 hibernate 使用的序列,如果你没有明确命名的话。我想知道该表是否有serial字段(即integer和DEFAULT nextval('tablename_colname_id_seq'),并且您以某种方式使用该序列而不是hibernate_sequence。在psql中尝试\d tablename,如果有一个默认尝试select * from tablename_colname_id_seq(或nextval(..)调用中的任何内容)来查看该序列的下一个序列值是什么。如果它接近您无法解释的值,则意味着您可能正在获取ID从表自己的序列。
标签: hibernate postgresql