Почему стратегия алгоритма Hibernate Hi-Lo умножает последовательность на 50? - PullRequest
0 голосов
/ 24 апреля 2019

Я использую Hibernate 5.3.7 . После установки hibernate.id.new_generator_mappings по умолчанию с true на false устраняется уникальная ошибка ограничения.

Но сталкиваясь с другим поведением создания идентификатора:

Идентификатор, сгенерированный Hibernate = (50 * (start_with) значение последовательности Oracle) + 1

Это стандартное поведение алгоритма Hilo?

Заранее спасибо.

Предлагаемый подход - https://hibernate.atlassian.net/browse/HHH-10983

Привет-Ло: https://vladmihalcea.com/the-hilo-algorithm/

Я могу прочитать привет, и значение lo будет рассчитано на [(hi -1) * incrementSize) + 1, (hi * incrementSize)) По умолчанию значение incrementSize равно 50.

В чем причина умножения значения start_with на 50?

Например:

У меня есть таблица с начальным значением последовательности 5000

Тогда мое приложение Hibernate запустится с (5000 * 50) = 250000

Объединенная стратегия - Завершено в исключении уникального ограничения

А также: Как последовательность Oracle передается по используемым идентификаторам?

Согласно этому сайту, пробелы в идентификаторах являются нормальными:

https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:369390500346406705

1 Ответ

1 голос
/ 01 мая 2019

Решение:

@Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SEQUENCE) @SequenceGenerator(name = SEQUENCE, sequenceName = SEQUENCE) private Long titId;

Получил следующее предупреждение:

Найдено использование устаревшего генератора идентификаторов на основе последовательности [org.hibernate.id.SequenceHiLoGenerator]; используйте взамен org.hibernate.id.enhanced.SequenceStyleGenerator. Подробнее см. В Руководстве по отображению модели домена Hibernate.

Затем изменил мой код на SequenceStyleGenerator:

@Id @GenericGenerator(name="cmrSeq", strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator", parameters = { @Parameter(name = "sequence_name", value = "SEQUENCE")} ) @GeneratedValue(generator = "sequence_name") private Long titId;

Это решило мои две проблемы:

1) Устарело предупреждение исправлено 2) Теперь идентификатор генерируется в соответствии с последовательностью оракула. ​​

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...