Стратегия Hibernate hilo не генерирует значения в соответствии со следующим значением последовательности базы данных - PullRequest
1 голос
/ 05 февраля 2020

У меня есть конфигурация jpa, подобная этой:

    @Id
    //@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq_gen")
    @GeneratedValue(generator = "timedep_seq_gen")
    @GenericGenerator(
             name = "seq_gen",
             strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
                     parameters = {
                                @Parameter(name = "sequence_name", value = "sequence_myseq"),
                                @Parameter(name = "initial_value", value = "1"),
                                @Parameter(name = "increment_size", value = "10"),
                                @Parameter(name = "optimizer", value ="hilo")
                                }
            )
    private Long id;

Вставки создают значения идентификаторов, такие как 1,2,3 .. и это нормально, пока я вручную не сделаю

SELECT nextval('sequence_myseq');

Я ожидаю, что при запуске вышеупомянутого из pgadmin (или любого другого клиента) следующий набор значений, сгенерированный генератором jpa / hibernate, должен пропустить значения для столбца id, но это не так. Он по-прежнему генерирует значения без пропуска значений идентификатора. В чем здесь проблема?

РЕДАКТИРОВАТЬ 1 Пока я не получу конкретный ответ, похоже, что hilo оптимизация не будет работать для нескольких экземпляров. Следующее работает, но оно требует, чтобы вы также установили

 increment by 10 

в вашем определении последовательности.

@GeneratedValue(generator = "dep_seq_gen")
    @SequenceGenerator(
            name = "dep_seq_gen",
            sequenceName = "sequence_dep",
            allocationSize = 10
        )

1 Ответ

1 голос
/ 05 февраля 2020

Ограничения Hilo

Алгоритм Hilo не совместим с системами, которые не знают схему распределения hilo, и поэтому Hibernate поддерживает оптимизатор pooled.

Объединенный в пул оптимизатор

В отличие от hilo, оптимизатор pooled включает значения последовательности базы данных в значения идентификаторов, выделяемые приложением. По этой причине любое новое значение последовательности не будет конфликтовать с предыдущими или будущими значениями.

Поскольку pooled используется по умолчанию, вы также можете упростить отображение @Id, используя SequenceGenerator вместо более подробный @GenericGenerator, который вы использовали для hilo:

@Id
@GeneratedValue(
    strategy = GenerationType.SEQUENCE,
    generator = "sequence_myseq"
)
@SequenceGenerator(
    name = "sequence_myseq",
    sequenceName = "sequence_myseq",
    allocationSize = 3
)
private Long id;

Переход с hilo на пул

Если вы использовали hilo и хотите перейти на оптимизатор pooled, вам нужно будет изменить значение последовательности, так как в противном случае возникнут конфликты.

Ознакомьтесь с этой статьей , чтобы узнать подробнее о том, как вы можете выполнить переход с hilo на pooled оптимизатор.

...