2011-11-08 10 views
6

Sono nuovo di Grails. Ho un campo nel mio oggetto dominio che definisco come String.Campi AutoIncrement diversi da Id in grails

String ponum 

Quando clicco prima volta sulla generazione pagina, il campo "ponum" deve visualizzare 0001 e in seguito ha di salvare in database.And quando clicco sul seconda volta il campo "ponum" deve visualizzare 0002 e più tardi deve salvare nel database. Ogni volta che clicco sulla pagina crea il campo "ponum" deve autoincrementare e salvarlo database. Io google, ma non ho ricevuto alcun documento. grazie

+1

Il campo di versione (che viene aggiunto automaticamente dal graal) si dice anche quante volte la fila è stata aggiornata. Grails lo incrementa automaticamente ogni volta che la riga viene aggiornata, quindi se questo è tutto quello che stai cercando, potrebbe funzionare per te. – Todd

risposta

6

Come le cose si fanno un id in ogni caso (supponendo che si sta utilizzando un RDBMS regolari con genaerator id standard), perché non fingere semplicemente che ci sia una variabile ponum basata sull'ID?

Basta aggiungere un getter alla classe di dominio:

class Page { 
    String getPonum() { 
    String.format("%04d", id) 
    } 
} 
+0

Grazie per la risposta sta funzionando per me. Ma quando clicco sulla pagina di creazione sta mostrando "null". Invece di ho bisogno di mostrare nuovo ponum nella pagina di creazione. –

+0

@SathishKumar Ahhh ... l'ID non viene creato fino a quando non viene salvato per la prima volta ... Puoi cambiarlo in: 'id? String.format ("% 04d", id): "Non salvato" per mostrare qualcosa all'utente prima che venga salvato, o usare qualcosa come una "sequenza" se il tuo (il database li supporta). Tuttavia ciò significherebbe che facendo clic su 'create page' creeremmo un sacco di nuovi' ponum' che potrebbero non essere mai inseriti nel database –

1

Secondo this answer, non è possibile utilizzare i generatori di ibernazione (quelli utilizzati per gli ID) per farlo. Se hai davvero bisogno di usare i generatori di Hibernate, una soluzione è descritta anche nella risposta.

Nel tuo caso, è possibile utilizzare un intercettore al generatore vostra proprietà ponum quando si inserisce un nuovo oggetto:

class Yours { 
    int ponum 

    def beforeInsert() { 
    def lastPonum = Book.list([sort: 'ponum', order:'desc', max: 1]) 
    if(lastPonum) 
     ponum = (lastPonum.pop().ponum as int) + 1 as String 
    else 
     ponum = '0' 
    } 
} 
+3

Questa risposta non è thread-safe. Se hai due thread che fanno un inserto contemporaneamente, entrambi otterranno lo stesso ponum. – mmigdol

Problemi correlati