Hibernate генерирует следующий порядковый номер, увеличивая предыдущий на 100 - PullRequest
0 голосов
/ 09 января 2019

Я пишу сущность JPA и хочу, чтобы Hibernate автоматически генерировал ее идентификатор. Я использую аннотацию @GenericGenerator с некоторыми параметрами управления стратегией и приращением. Я хочу, чтобы идентификаторы генерировались последовательно (1, 2, 3, 4, ...), но каким-то образом Hibernate решает, что он должен быть создан путем увеличения предыдущего идентификатора на 100 (1, 101, 201, ...). Кстати, я использую Derby Embedded.

Я обнаружил, что стратегия = "приращение" соответствует моей цели, но, как я понимаю, его тип не безопасен для потоков.

@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
)

Итак, как я могу использовать стратегию = "extended-sequence" и увеличить идентификатор на 1? Возможно ли это?

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Благодаря этому ответу https://stackoverflow.com/a/31804619/9161059. Автоинкремент добавляет 100 по умолчанию, если Derby db был прерван. Вот объяснение preallocator: https://db.apache.org/derby/docs/10.9/ref/rrefproperpreallocator.html

0 голосов
/ 09 января 2019

Вам необходимо проверить значение INCREMENT BY последовательности вашей базы данных в вашей базе данных . Hibernate запрашивает только следующее значение последовательности из базы данных. Затем база данных увеличивает его на размер шага настройки (в вашем случае 100) и возвращает новое значение.

Прежде чем я объясню параметр increment_size в Hibernate, пожалуйста, взгляните на @GeneratedValue(strategy = GenerationType.SEQUENCE), который я объясняю в этой статье и этого видео . Это гораздо более простой способ сказать Hibernate использовать последовательность базы данных для генерации первичных ключей.

increment_size, который вы настраиваете для @GenericGenerator, используется только для внутреннего использования, чтобы уменьшить количество обращений к базе данных. Он должен быть таким же, как настроено для вашей последовательности базы данных Сконфигурированный increment_size сообщает Hibernate, как часто он может увеличить извлеченное значение последовательности внутри, прежде чем он должен будет извлечь другое значение из последовательности. Вот краткий пример того, что происходит, если вы установите increment_size в 5:

    1. Entity: Hibernate извлекает новое значение последовательности из базы данных. База данных возвращает 1 и увеличивает свое внутреннее значение на 5. --- Значение, используемое Hibernate: 1 Значение в базе данных: 6
    1. Сущность: Hibernate увеличивает внутреннее значение идентификатора --- Значение, используемое Hibernate: 2 Значение в базе данных: 6
    1. Сущность: Hibernate увеличивает внутреннее значение идентификатора --- Значение, используемое Hibernate: 3 Значение в базе данных: 6
    1. Сущность: Hibernate увеличивает внутреннее значение идентификатора --- Значение, используемое Hibernate: 34 Значение в базе данных: 6
    1. Сущность: Hibernate увеличивает внутреннее значение идентификатора --- Значение, используемое Hibernate: 5 Значение в базе данных: 6
    1. Entity: Hibernate извлекает следующее значение последовательности из базы данных. База данных возвращает 6 и увеличивает свое внутреннее значение на 5. --- Значение, используемое Hibernate: 6 Значение в базе данных: 11
...