首页 > 解决方案 > Hibernate hilo 策略不根据下一个数据库序列值生成值

问题描述

我有一个这样的 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
        )

标签: javahibernatejpaormhilo

解决方案


希洛限制

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

池化优化器

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

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

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

从 hilo 迁移到 pooled

如果您使用hilo并想迁移到pooled优化器,则需要更改序列值,否则会产生冲突。


推荐阅读