Генератором идентификатора по умолчанию для Postgresql в Hibernate является SequenceGenerator [1].
т.е. Hibernate выполнит SELECT nextval ('hibernate_sequence')
для генерации идентификатора перед выполнением INSERT foo (id, ...) VALUES (123, ...)
при фиксации сеанса .
Однако PostgreSql поддерживает столбцы идентификатора автоинкремента (см., Например, [2]), а генератор по умолчанию для всех других баз данных, поддерживающих автоинкремент, должен использовать эту функцию [3] и выполнять вставки без значения идентификатора и запрашивать база данных для нового идентификатора (до фиксации сеанса, но в транзакции сеанса).
Я видел недавнее обсуждение [4], в котором предполагалось, что первая стратегия в целом лучше из-за несоответствия вставки перед сессией-фиксацией.
Если SequenceGenerator лучше (согласно [4]), почему он не используется по умолчанию для баз данных, которые его поддерживают (см. [3])?
Если IdentityGenerator лучше, почему PostgreSql явно выбирает SequenceGenerator, когда Postgres делает поддерживать первое (согласно [2])?
Я пытался найти историю решения переопределить значение по умолчанию в диалекте Postgres (см. [1]), но мне не удалось найти соответствующий коммит в GitHub. Я проследил за кодом обратно в репозиторий SVN, но след замолкает, когда файл PostgreSQLDialect добавляется в r11563 с бесполезным сообщением фиксации «миграция maven» [5]. Кажется, я не могу больше следить за историей. Может ли кто-нибудь найти фиксацию, которая добавила это переопределение? Возможно, в сообщении коммита есть больше информации.
Заранее спасибо.