Этот пост старый, но для тех, у кого могут быть такие же проблемы.
Как указал Стив Эберсол, вы должны использовать оптимизатор "pooled-lo" в вашем случае.
Проверьте также свою версию гибернации, она должна быть> = 4.3.11, потому что в предыдущих версиях была проблема .
Чтобы пояснить это с помощью оптимизатора pooled-lo, значение, хранимое в базе данных, является нижним значением следующего доступного интервала.
Таким образом, если идентификатор последней сохраненной сущности находится в [1; 10], следующий доступный интервал будет [11,20], а значение, хранящееся в базе данных, будет 11, как вы и ожидали.
Таким образом, если у вас есть другая программа, которая не использует hibernate и даже не знает о размере приращения, определенном в конфигурации hibernate, она все равно сможет вставлять объекты без прерывания последовательности.
Все, что ему нужно будет сделать - это атомарно получить значение последовательности и увеличить его, а затем использовать извлечение значения (до «приращения») в качестве нового идентификатора сущности, который он хочет вставить.
В нашем примере для вставки одной строки будет обновлено значение последовательности до 12 и добавлена новая сущность с идентификатором 11.
Таким образом, когда hibernate достигнет последнего идентификатора своего текущего интервала в памяти (10), он запросит базу данных и сохранит значение 22, чтобы сохранить для себя новый интервал id [12; 21].