Hibernate通过将前一个递增100

时间:2019-01-08 21:53:10

标签: hibernate jpa kotlin derby

我正在编写一个JPA实体,希望它的ID由Hibernate自动生成。我正在使用带有一些参数的@GenericGenerator注释来管理策略和增量。我希望随后生成ID(1、2、3、4,...),但是以某种方式Hibernate决定必须通过将以前的ID加100(1、101、201,...)来生成ID。 顺便说一句,我正在使用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?有可能吗?

2 个答案:

答案 0 :(得分:0)

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

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

increment_size配置的@GenericGenerator仅在内部用于减少数据库往返次数。它必须与为数据库序列配置的相同。 已配置的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使用的值:34数据库中的值:6
    1. 实体:Hibernate在内部增加id值--- Hibernate使用的值:5数据库中的值:6
    1. 实体:Hibernate从数据库中检索下一个序列值。数据库返回6,并将其内部值增加5。--- Hibernate使用的值:6数据库中的值:11

答案 1 :(得分:0)

感谢这个答案https://stackoverflow.com/a/31804619/9161059。如果Derby db被终止,则默认情况下,Autoincrement会自动添加100。这是预分配器的说明:https://db.apache.org/derby/docs/10.9/ref/rrefproperpreallocator.html