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 database 的 INCREMENT 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 会发生什么:
- 实体:Hibernate 从数据库中检索一个新的序列值。数据库 returns 1 并将其内部值增加 5。 --- Hibernate 使用的值:1 数据库中的值:6
- 实体:Hibernate 在内部递增 id 值 --- Hibernate 使用的值:2 数据库中的值:6
- 实体:Hibernate 在内部递增 id 值 --- Hibernate 使用的值:3 数据库中的值:6
- 实体:Hibernate 在内部递增 id 值 --- Hibernate 使用的值:34 数据库中的值:6
- 实体:Hibernate 在内部递增 id 值 --- Hibernate 使用的值:5 数据库中的值:6
- 实体: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
我正在编写一个 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 database 的 INCREMENT 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 会发生什么:
- 实体:Hibernate 从数据库中检索一个新的序列值。数据库 returns 1 并将其内部值增加 5。 --- Hibernate 使用的值:1 数据库中的值:6
- 实体:Hibernate 在内部递增 id 值 --- Hibernate 使用的值:2 数据库中的值:6
- 实体:Hibernate 在内部递增 id 值 --- Hibernate 使用的值:3 数据库中的值:6
- 实体:Hibernate 在内部递增 id 值 --- Hibernate 使用的值:34 数据库中的值:6
- 实体:Hibernate 在内部递增 id 值 --- Hibernate 使用的值:5 数据库中的值:6
- 实体:Hibernate 从数据库中检索下一个序列值。数据库 returns 6 并将其内部值增加 5。 --- Hibernate 使用的值:6 数据库中的值:11
感谢这个回答