【问题标题】:Sequence Generator keeps starting with a new value each time it is compiled序列生成器每次编译时都会从一个新值开始
【发布时间】:2021-10-03 00:16:12
【问题描述】:

我用过

@SequenceGenerator(name="q_seq", sequenceName="q_id")

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="q_seq")

在 ID 上面的实体类中,但每次我编译程序时,id 值都不会从前一个值继续,而是起始值会发生变化。

请帮忙,谢谢!

【问题讨论】:

  • 您是否删除了中间的实体或创建失败?请注意,序列是数据库的一部分,因此重新编译或重新启动应用程序不应更改序列,因此值会不断增长。
  • @Thomas 不,我没有删除任何实体,也没有失败的创建。但是每次我在本地主机上运行它并重新编译它时,起始值都会改变,当服务器的同一个实例正在运行时,值会增加,但如果我重新启动它,那么起始值就会不同

标签: java hibernate jpa annotations


【解决方案1】:

这是意料之中的,这是由于 SequenceGenerator 内部使用了 HiLo 算法。 https://docs.jboss.org/hibernate/orm/current/javadocs/org/hibernate/id/SequenceHiLoGenerator.html

https://en.wikipedia.org/wiki/Hi/Lo_algorithm

您应该只假设默认情况下它会增加且唯一。

但是,如果您修改序列生成器注释 分配大小 = 1,初始值 = 1 那么它应该按照你期望的方式运行,但它会带来性能成本

【讨论】:

  • 您可能希望链接到较新版本的 hibernate,并直接链接到描述优化的位置。
  • 您好 Thomas,文档说明“使用 hilo 算法的 id 生成器”en.wikipedia.org/wiki/Hi/Lo_algorithm 这是我提到的优化。 “基本思想是你有两个数字来组成一个主键——一个“高”数字和一个“低”数字。客户端基本上可以递增“高”序列,知道它可以安全地从前一个“高”值与各种“低”值的整个范围。”
  • 是的,我知道 hilo 算法,但其他人可能不知道。您可以直接指出这一点,而不是“优化”。仍然存在的是指向 Hibernate 3 的链接的问题,它应该每天使用更少。
猜你喜欢
  • 2021-10-20
  • 2021-08-17
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-24
  • 2016-11-25
  • 1970-01-01
相关资源
最近更新 更多