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>
¿Fue útil?

Solución

Esto es indocumentado pero en realidad puedes usar un identity Generador 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>

Ver HB-875 y HHH-1675 Para los antecedentes sobre esto.

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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top