2010-08-08 7 views
17

Le mie tabelle PostgreSQL hanno ID di tipo bigserial, ovvero vengono generate al momento dell'inserimento delle righe (e quindi il valore della colonna id non viene fornito nell'istruzione INSERT). Ho difficoltà a trovare il valore corretto per l'attributo <generator class="..."> nel mio file di mapping XML.Generatore di Hibernate id corretto per la colonna seriale/bigserial postgres?

Il codice seguente è il più vicino che ho trovato che sia il più vicino per Postgres, ma sta ancora eseguendo un SELECT nextval(...) sulla sequenza prima di inserirlo (e includendo esplicitamente il valore del campo ID sull'inserto). Voglio solo che Hibernate non includa 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> 

risposta

19

Questo è documentato, ma si può effettivamente utilizzare un generatore identity 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 lo sfondo su questo.

+0

Per le nuove versioni (JPA): http://stackoverflow.com/questions/4979746/mapping-postgresql-serial-type-with-hibernate-annotations –

1

provato in seguito 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> 
4

Da quanto ho letto:

<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 sequenza cade nei senza inserto generatori poid descritte in questo modo:

I generatori POID non inseriti 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 sul database, consentendo a NHibernate di ritardare la scrittura fino al completamento della transazione aziendale , riducendo i round trip nel database.

Mentre il generatore di identità è Post-insert poid generatori gruppo:

generatori Post-inserto poid richiedono dati da persistenti al database un ID da generare. Questo altera il comportamento di NHibernate in modi molto sottili e disabilita alcune funzionalità di prestazione. Come tale, l'uso di questi generatori POID è fortemente sconsigliato! Loro devono essere utilizzati solo con database esistenti in cui altre applicazioni si basano su questo comportamento.

Le citazioni sono state prese dal libro di cucina di NHibernate 3.0.

+0

Sembra che i due blocchi di codice che stai confrontando siano identico, mi manca qualcosa? –

+1

@Matt Huggins: ho incollato male: D ora cambiato –