serial generationtype example auto_increment java hibernate postgresql mapping hibernate-mapping

java - generationtype - jpa sequence postgresql



¿Generador de ID de Hibernate adecuado para la columna serial/bigser de postgres? (3)

Mis tablas PostgreSQL tienen ID de tipo bigserial , lo que significa que se generan en el momento en que se insertan las filas (y, por lo tanto, el valor de la columna ID no se proporciona en la INSERT ). Tengo dificultades para encontrar el valor adecuado para el atributo <generator class="..."> en mi archivo de asignación XML.

El código a continuación es el más cercano que he encontrado que parece ser el más cercano a Postgres, pero aún está ejecutando un siguiente valor SELECT nextval(...) en la secuencia antes de insertar (e incluir explícitamente el valor del campo id en la inserción). Solo quiero que Hibernate no incluya el valor del campo de identificación, lo que permite a Postgres hacer 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>


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 trabajar más rápido que:

<id name="id" column="id" type="java.lang.Long"> <generator class="identity" /> </id>

El generador de secuencia se incluye en los generadores de POID sin inserción descritos de esta manera:

Los generadores POID sin inserción son la mejor opción para nuevas aplicaciones. Estos generadores permiten a NHibernate asignar una identidad a un objeto persistente sin escribir los datos del objeto en la base de datos, lo que permite que NHibernate demore la escritura hasta que se complete la transacción comercial, lo que reduce los viajes de ida y vuelta a la base de datos.

Mientras que el generador de identidad es un grupo de generadores POID de inserción posterior :

Los generadores de POID de inserción posterior requieren que los datos se conserven en la base de datos para que se genere una ID. Esto altera el comportamiento de NHibernate de maneras muy sutiles e inhabilita algunas características de rendimiento. Como tal, el uso de estos generadores de POID es fuertemente desaconsejado! Solo deben usarse con bases de datos existentes donde otras aplicaciones se basan en este comportamiento.

Las citas fueron tomadas de NHibernate 3.0 Cookbook.


Esto no está documentado, pero en realidad se puede usar un generador de identity con PostgreSQL cuando la PK es de tipo SERIAL o BIGSERIAL :

<id name="id" column="user_id" type="java.lang.Long"> <generator class="identity"/> </id>

Consulte HB-875 y HHH-1675 para obtener información sobre esto.


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>