El generador de identificador predeterminado para Postgresql en Hibernate es SequenceGenerator [1]. es decir, Hibernate hará SELECT nextval('hibernate_sequence')
para generar una ID antes de hacer un INSERT foo (id, ...) VALUES (123, ...)
en la confirmación de la sesión.¿Por qué el generador predeterminado de Hibernate para PostgreSql es "SequenceGenerator", no "IdentityGenerator"?
Sin embargo, PostgreSql admite columnas autoincrement id (ver por ejemplo [2]), y el generador predeterminado para todas las otras bases de datos que admiten autoincrement es usar esa característica [3] y realizar inserciones omitiendo el valor id y consultar la base de datos para la nueva identificación (antes de la confirmación de la sesión, pero dentro de la transacción de la sesión).
He visto algunos debates recientes [4] que sugieren que la estrategia anterior es mejor en general, debido a la falta de coincidencia de insertar antes de la sesión.
Si SequenceGenerator es mejor (según [4]), ¿por qué no es el predeterminado para las bases de datos que lo admiten (ver [3])?
Si IdentityGenerator es mejor, ¿por qué PostgreSql elige explícitamente SequenceGenerator cuando Postgres admite el primero (según [2])?
Traté de encontrar el historial de la decisión de anular el valor predeterminado en el dialecto de Postgres (ver [1]), pero no pude encontrar la confirmación pertinente en GitHub. He seguido el código de regreso al repositorio SVN, pero el camino se vuelve frío donde se agrega el archivo PostgreSQLDialect en r11563 con un mensaje de confirmación inútil de "migración de maven" [5]. Parece que no puedo seguir la historia más atrás. ¿Alguien puede encontrar el compromiso que agregó esta anulación? Tal vez haya más información en el mensaje de confirmación.
Gracias de antemano.
[4] http://nhforge.org/blogs/nhibernate/archive/2009/03/20/nhibernate-poid-generators-revealed.aspx
Supongo que esto se debe a que el tipo de datos 'serial' es solo una" secuencia disfrazada ". –
Eso no lo explica: todas las columnas de autoincrement son secuencias disfrazadas. – Rich
no, no para SQL Server o MySQL donde no se puede obtener el siguiente valor sin hacer esa inserción (que es la gran diferencia entre una solución basada en secuencia y un "autoincremento") –