2010-04-06 4 views
6

È possibile creare una tabella che non ha 'id'? Ad esempio, questo è il mio dominio:È possibile che un dominio Grails non abbia un 'id'?

class SnbrActVector { 

    int nid 
    String term 
    double weight 

    static mapping = { 
     version false 
     id generator: 'identity' 
    } 

    static constraints = { 
    } 
} 

Quando ho eseguito questa istruzione SQL, non riesce:

insert into snbr_act_vector values (5, 'term', 0.5) 

ho controllato il tavolo e 'id' è già impostato su AutoIncrement. Sto pensando che un'altra opzione è quella di rimuovere l''id' stesso. O c'è un'altra soluzione per questo? Supponiamo che non sia un'opzione per modificare l'istruzione SQL di givent.

risposta

1

Provare a utilizzare: "id (generatore: 'assegnato')" invece di "id generator: 'identity'" e vedere se rimuove la proprietà autoincrement dalla colonna del database "id".

+0

grazie per la risposta. ho appena testato il tuo suggerimento ora e, sfortunatamente, l''id' è ancora lì. – firnnauriel

+0

btw, ha rimosso la proprietà autoincrement di 'id'. ma quello di cui ho bisogno è di rimuovere completamente la colonna 'id' e avere solo 3 colonne: nid, term, weight – firnnauriel

4

Probabilmente è necessario specificare che nid è la colonna id.

static mapping = { 
    version false 
    id generator: 'identity', column: 'nid' 
} 
+0

sembra che questo potrebbe essere un altro approccio. potrei aver bisogno di giocare con la proprietà 'generatore'. per favore ricorda ancora che l'obiettivo principale è di far funzionare questa affermazione senza alcuna modifica: inserisci nei valori snbr_act_vector (5, 'term', 0.5) – firnnauriel

+0

Se questo è veramente il tuo obiettivo, potrebbe essere necessario fare qualche setup extra nel tuo DB. Forse un trigger per tradurre la dichiarazione nella definizione della tabella? Altrimenti, penso che la risposta di Luke sia vicina al massimo che puoi fare da Grails/GORM. –

6

Gorm richiede un campo ID per funzionare. È possibile simulare un ID assegnato utilizzando una variabile transitoria come di seguito. I getter e i setter mappano il campo nid al campo id.

Quando si salva un oggetto di dominio utilizzando questo metodo si deve fare:

snbrActVectgor.save(insert:true) 

perché graal pensa un id non nullo è un'istanza persistente.

class SnbrActVector { 
    Integer id 
    // nid is the actual primary key 
    static transients = ['nid'] 
    void setNid(Integer nid) { 
     id = nid 
    } 
    Integer getNid() { 
     return nid 
    } 

    static mapping = { 
     version false 
     id generator:'assigned', column:'nid', type:'integer' 
    } 
} 
2

Non c'è modo di non avere "id". quello che puoi fare è cambiare il nome del campo "id" usando il generatore di id assegnato.

0

Sì in Oracle è possibile utilizzare ROWID per la colonna ID.

class Document { 
    String id 

    static mapping = { 
     table "DOCUMENTS" 
     version false 
     id column: 'ROWID' 
    } 

}