Почему генератор Hibernate по умолчанию для PostgreSql «SequenceGenerator», а не «IdentityGenerator»?

Генератором идентификатора по умолчанию для 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]. Кажется, я не могу больше следить за историей. Может ли кто-нибудь найти фиксацию, которая добавила это переопределение? Возможно, в сообщении коммита есть больше информации.

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

[1] https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/dialect/PostgreSQL81Dialect.java#L267

[2] Автоинкремент PostgreSQL

[3] https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java#L639

[4] http://nhforge.org/ blogs / nhibernate / archive / 2009/03/20 / nhibernate-poid-generators -hibited.aspx

[5] https://source.jboss.org/browse/Hibernate/core/trunk/core/src/main/java/ org / hibernate / dialect / PostgreSQLDialect.java? FocusRev = 14993 & fromRev = 11563 & toRev = 14993 # r14993

8
задан Community 23 May 2017 в 12:16
поделиться