【问题标题】:The Hibernate hilo strategy does not generate the values according to the next database sequence valueHibernate hilo 策略不根据下一个数据库序列值生成值
【发布时间】:2020-02-05 09:39:34
【问题描述】:

我有一个这样的 jpa 配置:

    @Id
    //@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq_gen")
    @GeneratedValue(generator = "timedep_seq_gen")
    @GenericGenerator(
             name = "seq_gen",
             strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
                     parameters = {
                                @Parameter(name = "sequence_name", value = "sequence_myseq"),
                                @Parameter(name = "initial_value", value = "1"),
                                @Parameter(name = "increment_size", value = "10"),
                                @Parameter(name = "optimizer", value ="hilo")
                                }
            )
    private Long id;

插入正在创建像 1,2,3.. 这样的 id 值,这很好,直到我手动执行

SELECT nextval('sequence_myseq');

我希望从 pgadmin(或任何其他客户端)运行上述内容时,jpa/hibernate 生成器生成的下一组值应该跳过 id 列的值,但事实并非如此。它仍然会生成值而不跳过任何 id 值。这里有什么问题?

编辑 1 直到我得到一些具体的答案,看起来hilo 优化不适用于多个实例。以下是有效的,但它需要你设置

 increment by 10 

在您的序列定义中也是如此。

@GeneratedValue(generator = "dep_seq_gen")
    @SequenceGenerator(
            name = "dep_seq_gen",
            sequenceName = "sequence_dep",
            allocationSize = 10
        )

【问题讨论】:

    标签: java hibernate jpa orm hilo


    【解决方案1】:

    希洛限制

    Hilo 算法不能与不知道 hilo 分配方案的系统互操作,这就是 Hibernate 支持 pooled 优化器的原因。

    池化优化器

    与hilo 不同,pooled 优化器将数据库序列值包含在应用程序分配的标识符值中。因此,任何新的序列值都不会与之前或未来的值发生冲突。

    由于默认使用pooled,您还可以使用SequenceGenerator 来简化您的@Id 映射,而不是使用用于hilo 的更详细的@GenericGenerator:

    @Id
    @GeneratedValue(
        strategy = GenerationType.SEQUENCE,
        generator = "sequence_myseq"
    )
    @SequenceGenerator(
        name = "sequence_myseq",
        sequenceName = "sequence_myseq",
        allocationSize = 3
    )
    private Long id;
    

    从 hilo 迁移到 pooled

    如果你使用hilo,想migrate to the pooled optimizer,则需要更改序列值,否则会产生冲突。

    【讨论】:

    • ' 不能与不知道 hilo 分配方案的系统互操作',但我说的是具有相同代码的同一服务器的两个实例。因此他们都知道hilo分配,但它仍然不起作用。我看到 LegacyHiLoAlgorithmOptimizer 曾经支持这一点,但现在它们已在新实现中删除
    • 如果您可以使用 this test case template 针对最新的 Hibernate ORM 版本复制问题,那么您应该打开 Jira 问题。使用两个不同的SesisonFactory 实例来模拟多个服务器并使用两个线程来查看是否发生冲突。
    • 如果Hibernate说这个hilo优化可以在多服务器环境下使用,那毫无疑问是个缺陷。生成值的代码甚至不依赖于回调中序列的值。只有高值发生变化。
    • 幸运的是,Hibernate 是一个开源项目,因此您可以解决问题并发送 Pull Request。这才是开源软件开发的真正精神。
    • 当然。但我需要先创建一个缺陷。
    猜你喜欢
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 2022-10-21
    相关资源
    最近更新 更多