Hibernate 通过将前一个序列号递增 100 来生成下一个序列号

Hibernate generates next sequence number by incrementing previous by 100

我正在编写一个 JPA 实体并希望它的 ID 由 Hibernate 自动生成。我正在使用 @GenericGenerator 注释和一些管理策略和增量的参数。我希望随后生成 ID(1、2、3、4、...),但不知何故 Hibernate 决定必须通过将先前的 ID 递增 100(1、101、201、...)来生成它。 顺便说一句,我正在使用 Derby Embedded。

我发现 strategy = "increment" 符合我的目标,但据我了解,它的类型不是线程安全的。

@Table(name = "ACCOUNTS")
data class Account(
        @Id
        @GenericGenerator(name = "ACCOUNT_SEQ",
                strategy = "enhanced-sequence",
                parameters = [
                    Parameter(name = "initial_value", value = "1"),
                    Parameter(name = "increment_size", value = "1")]
        )
        @GeneratedValue(generator = "ACCOUNT_SEQ")
        @Column(name = "ID")
        val id: Long
)

那么,如何使用 strategy = "enhanced-sequence" 并将 id 递增 1?可能吗?

您需要检查数据库序列 in your databaseINCREMENT BY 值。 Hibernate 只从数据库请求下一个序列值。然后数据库将其增加配置步长(在您的情况下为 100)和 returns 新值。

在我解释Hibernate的increment_size参数之前,请看一下我在this article and this video中解释的@GeneratedValue(strategy = GenerationType.SEQUENCE)。这是告诉 Hibernate 使用数据库序列生成主键的更简单的方法。

您为 @GenericGenerator 配置的 increment_size 仅在内部用于减少数据库往返次数。它需要与为您的数据库序列配置的相同。 配置的 increment_size 告诉 Hibernate 在必须从序列中获取另一个值之前,它可以在内部增加检索到的序列值的频率。 这是一个简单的示例,说明如果将 increment_size 设置为 5 会发生什么:

    1. 实体:Hibernate 从数据库中检索一个新的序列值。数据库 returns 1 并将其内部值增加 5。 --- Hibernate 使用的值:1 数据库中的值:6
    1. 实体:Hibernate 在内部递增 id 值 --- Hibernate 使用的值:2 数据库中的值:6
    1. 实体:Hibernate 在内部递增 id 值 --- Hibernate 使用的值:3 数据库中的值:6
    1. 实体:Hibernate 在内部递增 id 值 --- Hibernate 使用的值:34 数据库中的值:6
    1. 实体:Hibernate 在内部递增 id 值 --- Hibernate 使用的值:5 数据库中的值:6
    1. 实体:Hibernate 从数据库中检索下一个序列值。数据库 returns 6 并将其内部值增加 5。 --- Hibernate 使用的值:6 数据库中的值:11

感谢这个回答. Autoincrement adds 100 by default if Derby db was terminated. Here is an explanation of preallocator: https://db.apache.org/derby/docs/10.9/ref/rrefproperpreallocator.html