Если я правильно вас понял, проблема в том, что 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