2012-02-27 8 views
7

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.

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

[2] PostgreSQL Autoincrement

[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-revealed.aspx

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

+3

Supongo que esto se debe a que el tipo de datos 'serial' es solo una" secuencia disfrazada ". –

+0

Eso no lo explica: todas las columnas de autoincrement son secuencias disfrazadas. – Rich

+0

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") –

Respuesta

2

Tal vez porque los generadores afterInsert generalmente se rompen para PG en NHibernate porque usa el estilo de parámetros externos de OracleStyle que no es compatible con el controlador npgsql-ADONET que devuelve el resultado como resultado de la consulta y no como parámetro.

SQL: INSERT INTO .... devuelve el id en nhoutparameter; : nhoutparameter = null;

utilizando Oracle esto funciona

command.Execute(); 
object id = command.Parameter["nhoutparameter"].Value; 
Assert.NotNull(id); 

en PG no. Debe ser

object id = command.ExecuteScalar(); 
+0

Esto tiene sentido para NHibernate. ¿Sabes si lo mismo se aplica a Hibernate? – Rich

+0

tal vez. no tengo el entorno aquí para probar. Para NH acabo de obtener la fuente y ejecuté UnitTests contra PG. Todas las pruebas postInsertGenerator fallaron. Podrías hacer lo mismo con Hibernatesource desde github corriendo contra PG. – Firo

0

Esto es sólo especulación ya que No puedo encontrar buenas características/documentos de versión en postgres, pero ...

Quizás el dialecto postgres se agregó antes de que se implementara el serial, estable, ampliamente utilizado, o los desarrolladores que implementaron el dialecto lo sabían. Cambiar el generador de identificador predeterminado para un dialecto sería un cambio radical y esos son malos.

Cuestiones relacionadas