Как установить последовательность гибернации вручную в MySQL? - PullRequest
1 голос
/ 25 января 2011

Я выполняю некоторую миграцию данных после некоторого рефакторинга модели данных, и я беру пару таблиц со сложными первичными ключами, объединяю их в большую таблицу и даю свой собственный уникальный первичный ключ.На данный момент я написал некоторый SQL для копирования старых данных таблицы в новую таблицу и назначения первичного ключа с помощью AUTO_INCREMENT.После завершения миграции я удаляю AUTO_INCREMENT из поля PK.Итак, теперь это все подливка, но проблема в том, что мне нужна последовательность перехода в спящий режим, чтобы знать, каким будет следующий доступный ПК.Мы используем стратегию TABLE в целом для всех наших организаций, и я хотел бы оставаться последовательным и избегать использования AUTO_INCREMENT и стратегии IDENTITY для будущих объектов.Мне удалось временно установить соответствующую строку в сгенерированной таблице «hibernate_sequence» в качестве максимального идентификатора вновь созданной таблицы, но это всего лишь исправление проблемы.Кроме того, это приводит к тому, что следующие идентификаторы создаются намного больше максимального идентификатора.Я уверен, что это потому, что я не понимаю механизм назначения идентификаторов HiLo, поэтому я публикую здесь.Есть ли способ настроить это так, чтобы идентификаторы были последовательными?Или где находится код, который генерирует значение HiLo, чтобы я мог рассчитать, каким он должен быть для обеспечения последовательных идентификаторов?

Ответы [ 2 ]

2 голосов
/ 25 января 2011

Если я правильно вас понял, проблема в том, что hibernate не генерирует для вас последовательные идентификаторы. Но так работает генератор hi / lo, и я не совсем понимаю, почему он вам не нравится.

В основном, генератор Hi / lo основан на поддержке значений HIGH и LOW отдельно. Когда НИЗКИЙ достигает своего предела, он сбрасывается и ВЫСОКИЙ увеличивается. Ключ результата основан на объединении значений HIGH и LOW. Например. Предположим, что ключ - двойное слово, а HIGH и LOW - слова. ВЫСОКОЕ может быть оставлено два байта, а НИЗКОЕ - два байта справа.

Скачки ID зависят от двух факторов - максимального значения для LOW и события, которое вызывает изменение значения HIGH. По умолчанию в Hibernate максимальное значение для LOW равно Short.MAX_VALUE и сбрасывается при каждой инициализации генератора. Значение HIGH считывается из таблицы и увеличивается при каждой инициализации, а также увеличивается, когда LOW достигает своего верхнего предела. Все это означает, что при каждом перезапуске приложения у вас будут пропуски в идентификаторах.

Глядя на код, кажется, что если вы используете значение <1 для max_lo, ключ будет сгенерирован просто путем увеличения значения hi, которое читается из БД. Вам, вероятно, понравится такое поведение:) </p>

Посмотрите на исходный код org.hibernate.id.MultipleHiLoPerTableGenerator # generate

0 голосов
/ 24 февраля 2011

Используя org.hibernate.id.MultipleHiLoPerTableGenerator # generate, я выяснил, что мои партии были размером 50, и поэтому для моих целей с использованием max id / 50 + 1 сгенерировал полезное число, которое нужно было бросить в последовательность, чтобы сделать ихкак можно ближе к последовательному.

...