2010-08-08 5 views
17

Mis tablas PostgreSQL tienen identificadores del 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 del ID no se proporciona en la declaración INSERT). Tengo dificultades para encontrar el valor correcto para el atributo <generator class="..."> en mi archivo de mapeo XML.¿Generador de id de Hibernate adecuado para la columna serial/bigserial de postgres?

El código siguiente es el más cercano que he encontrado que parece ser el más cercano para Postgres, pero sigue realizando un SELECT nextval(...) en la secuencia antes de insertarlo (e incluye explícitamente el valor del campo de identificación en el inserto). 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> 

Respuesta

19

Esta es indocumentado, pero en realidad se puede utilizar un generador de identity con PostgreSQL cuando el 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 antecedentes sobre esto.

+0

Para las nuevas versiones (JPA): http://stackoverflow.com/questions/4979746/mapping-postgresql-serial-type-with-hibernate-annotations –

1

Probamos siguiente y funcionó:

<id name="id" column="id" type="long" unsaved-value="null" > 
     <generator class="sequence"> 
      <param name="sequence">my_sequence_name</param> 
     </generator> 
</id> 
4

De lo que he leído:

<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 secuencias cae en las generadores Poid no insertar descritos así:

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, permitiendo a NHibernate retrasar la escritura hasta que la transacción comercial sea completa, reduciendo los viajes redondos a la base de datos.

Mientras que el generador de identidad es Post-inserción generadores Poid grupo:

generadores Post-inserto Poid requieren que los datos se conservan en la base de datos para una ID que se genere. Esto altera el comportamiento de NHibernate de maneras muy sutiles y deshabilita algunas características de rendimiento. ¡Por lo tanto, se desaconseja el uso de estos generadores POID! Ellos solo deben usarse con bases de datos existentes donde otras aplicaciones se basan en este comportamiento.

Las cotizaciones fueron tomadas de NHibernate 3.0 Cookbook.

+0

Parece que sus dos bloques de código que está comparando son idéntico, ¿me estoy perdiendo algo? –

+1

@Matt Huggins: pegué mal: D cambió ahora –

Cuestiones relacionadas