【问题标题】:Postgres hibernate sequence value does not match inserted data idPostgres休眠序列值与插入的数据ID不匹配
【发布时间】: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 会有这么大的跳跃吗?从432711872053

就好像与 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 字段(即integerDEFAULT nextval('tablename_colname_id_seq'),并且您以某种方式使用该序列而不是hibernate_sequence。在psql 中尝试\d tablename,如果有一个默认尝试select * from tablename_colname_id_seq(或nextval(..) 调用中的任何内容)来查看该序列的下一个序列值是什么。如果它接近您无法解释的值,则意味着您可能正在获取ID从表自己的序列。

标签: hibernate postgresql


【解决方案1】:

我相信我正在经历以下帖子中描述的内容,这也与HiLo算法有关:hibernate oracle sequence produces large gap

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-21
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多