【问题标题】:Hibernate generates next sequence number by incrementing previous by 100Hibernate 通过将 previous 增加 100 来生成下一个序列号
【发布时间】:2019-06-03 15:29:55
【问题描述】:

我正在编写一个 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?有可能吗?

【问题讨论】:

标签: hibernate jpa kotlin derby


【解决方案1】:

感谢这个答案https://stackoverflow.com/a/31804619/9161059。如果 Derby db 被终止,自动增量默认增加 100。下面是对预分配器的解释:https://db.apache.org/derby/docs/10.9/ref/rrefproperpreallocator.html

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-17
      • 2021-12-05
      • 1970-01-01
      • 2015-12-14
      • 2019-08-18
      • 1970-01-01
      • 2011-12-02
      • 2016-04-04
      相关资源
      最近更新 更多