¿Generador de ID de hibernación adecuado para la columna serie/bigserial de Postgres?
-
26-09-2019 - |
Pregunta
Mis tablas PostgreSQL tienen ID de tipo bigserial
, lo que significa que se generan en el momento en que se insertan filas (y por lo tanto, el valor de la columna de identificación no se suministra en el INSERT
declaración). Tengo dificultades para encontrar el valor adecuado para el <generator class="...">
Atributo en mi archivo de asignación XML.
El siguiente código es lo más cercano que he encontrado que parece ser el más cercano para Postgres, pero todavía está realizando un SELECT nextval(...)
en la secuencia antes de insertar (e incluir explícitamente el valor del campo ID en el inserto). Solo quiero que Hibernate no incluya el valor de campo de identificación, lo que permite que Postgres haga su trabajo de generar el valor en sí.
<id name="id" column="id" type="java.lang.Long">
<generator class="sequence">
<param name="sequence">my_sequence_name</param>
</generator>
</id>
Otros consejos
De lo que leí:
<id name="id" column="id" type="java.lang.Long">
<generator class="sequence">
<param name="sequence">my_sequence_name</param>
</generator>
</id>
debería funcionar más rápido que:
<id name="id" column="id" type="java.lang.Long">
<generator class="identity" />
</id>
El generador de secuencia cae en el Generadores POID no insertados descrito así:
Los generadores POID no insertes son la mejor opción para nuevas aplicaciones. Estos generadores permiten que NHibernate asigne una identidad a un objeto persistente sin escribir los datos del objeto a la Tatabase, lo que permite que Nhibernate retrase la escritura hasta que la transacción comercial se complete, reduciendo los viajes redondos a la base de datos.
Mientras que el generador de identidad es Generadores Poid posteriores a la inserción grupo:
Los generadores de POID postinsert requieren que los datos persistan a la base de datos para que se genere una ID. Esto altera el comportamiento de Nhibernate de manera muy sutil y deshabilita algunas características de rendimiento. Como tal, ¡el uso de estos generadores POID está muy desanimado! Solo deben usarse con bases de datos existentes donde otras aplicaciones confían en este comportamiento.
Se tomaron citas del libro de cocina NHibernate 3.0.
Intenté seguir y funcionó:
<id name="id" column="id" type="long" unsaved-value="null" >
<generator class="sequence">
<param name="sequence">my_sequence_name</param>
</generator>
</id>