2010-04-06 15 views
6

Ist es möglich, eine Tabelle zu erstellen, die keine 'ID' hat? Zum Beispiel ist meine Domain:Ist es möglich, dass eine Grails-Domain keine ID hat?

class SnbrActVector { 

    int nid 
    String term 
    double weight 

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

    static constraints = { 
    } 
} 

Wenn ich diese SQL-Anweisung ausführen, es scheitert:

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

ich die Tabelle geprüft und 'id' ist bereits AUTOINCREMENT gesetzt. Ich denke, dass eine andere Option darin besteht, die 'ID' selbst zu entfernen. Oder gibt es eine andere Problemumgehung dafür? Bitte nehmen Sie an, dass es keine Option ist, die Gibent-SQL-Anweisung zu ändern.

Antwort

1

Versuchen Sie mit: "ID (Generator: 'zugewiesen')" anstelle von "ID Generator: 'Identität'" und sehen, ob das die Autoincrement-Eigenschaft aus der Datenbankspalte "ID" entfernt.

+0

danke für die Antwort. habe gerade deinen Vorschlag getestet und leider ist die 'ID' immer noch da. – firnnauriel

+0

BTW, es hat die Autoincrement-Eigenschaft von 'ID' entfernt. aber was ich brauche, ist die "id" -Spalte vollständig zu entfernen und nur 3 Spalten zu haben: nid, term, weight – firnnauriel

4

Sie müssen wahrscheinlich angeben, dass nid Ihre ID-Spalte ist.

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

sieht aus wie dies könnte ein anderer Ansatz sein. Möglicherweise muss ich mit der Eigenschaft 'generator' spielen. Bitte beachten Sie nochmals, dass das Hauptziel darin besteht, diese Anweisung ohne irgendeine Änderung daran arbeiten zu lassen: Einfügen in snbr_act_vector Werte (5, 'term', 0.5) – firnnauriel

+0

Wenn das wirklich Ihr Ziel ist, müssen Sie vielleicht etwas extra einrichten in deiner DB. Vielleicht ein Auslöser, um die Anweisung in die Tabellendefinition zu übersetzen? Ansonsten denke ich, dass Lukes Antwort dem von Grails/GORM am nächsten kommt. –

6

Gorm benötigt ein ID-Feld, um zu funktionieren. Sie können eine zugewiesene ID fälschen, indem Sie eine transiente Variable wie unten verwenden. Die Getter und Setter ordnen das Feld nid dem ID-Feld zu.

Wenn ein Domain-Objekt Speichern dieser Methode Sie zu tun haben:

snbrActVectgor.save(insert:true) 

weil Grails ein Nicht-Null-ID denkt eine persistente Instanz ist.

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

Es gibt keine Möglichkeit, keine "ID" zu haben. Sie können den Namen des Felds "ID" mithilfe des zugewiesenen ID-Generators ändern.

0

Ja in Oracle können Sie ROWID für ID-Spalte verwenden.

class Document { 
    String id 

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

} 
Verwandte Themen