Domanda

Le mie tabelle PostgreSQL hanno ID di tipo bigserial, nel senso che vengono generati al momento in cui le righe vengono inserite (e quindi il valore della colonna ID non viene fornito nel INSERT dichiarazione). Ho difficoltà a trovare il valore adeguato per il <generator class="..."> attributo nel mio file di mappatura XML.

Il codice seguente è il più vicino che ho trovato che sembra essere il più vicino per Postgres, ma sta ancora eseguendo un SELECT nextval(...) nella sequenza prima di inserire (e esplicitamente incluso il valore del campo ID sull'inserto). Voglio solo che Hibernate non includa affatto il valore del campo ID, consentendo a Postgres di fare il suo lavoro di generare il valore stesso.

    <id name="id" column="id" type="java.lang.Long">
        <generator class="sequence">
            <param name="sequence">my_sequence_name</param>
        </generator>
    </id>
È stato utile?

Soluzione

Questo non è documentato ma puoi effettivamente usare un identity Generatore con PostgreSQL quando il PK è di tipo SERIAL o BIGSERIAL:

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

Vedere HB-875 e HHH-1675 per sfondo su questo.

Altri suggerimenti

Da quello che leggo:

<id name="id" column="id" type="java.lang.Long">
    <generator class="sequence">
        <param name="sequence">my_sequence_name</param>
    </generator>
</id>

dovrebbe funzionare più velocemente di:

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

Il generatore di sequenze cade in Generatori di poid non inserti descritto così:

I generatori di poid non inserti sono l'opzione migliore per le nuove applicazioni. Questi generatori consentono a NHibernate di assegnare un'identità a un oggetto persistente senza scrivere i dati dell'oggetto a TheDatabase, consentendo a Nhibernate di ritardare la scrittura fino al completamento della transazione aziendale, riducendo i viaggi rotondi nel database.

Mentre il generatore di identità è Generatori poid post-inserti gruppo:

I generatori di poid post-inserti richiedono che i dati siano persistiti nel database per la generazione di un ID. Ciò altera il comportamento di NHibernate in modi molto sottili e disabilita alcune funzionalità di prestazione. In quanto tale, l'uso di questi generatori poid è fortemente scoraggiato! Dovrebbero essere usati solo con i database esistenti in cui altre applicazioni si basano su questo comportamento.

Le citazioni sono state prelevate dal libro di cucina Nhibernate 3.0.

Ho provato a seguire e ha funzionato:

<id name="id" column="id" type="long" unsaved-value="null" >
        <generator class="sequence">
            <param name="sequence">my_sequence_name</param>
        </generator>
</id>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top