2013-08-05 12 views
8

Um eine Fremdschlüsselspalte (kein joinTable) zu erreichen, wenn eine unidirektionale OneToMany Beziehung abbildet, folgt i den Schritten nach Grails (Version 2.2.3) Referenzdokumentation, section 6.5.2.1 OneToMany Mapping, in dem es heißtunidirektional OneToMany Beziehung ohne joinTable

Bei unidirektionalen Zuordnungen muss der Fremdschlüssel in der Assoziation selbst angegeben werden. Zum Beispiel eine unidirektionale OneToMany Beziehung zwischen Person gegeben (ersetzt durch One) und Anschrift (von vielen) ersetzt, der folgende Code wird den Fremdschlüssel in der Viele-Tabelle

class One { 

    static hasMany = [manyCollection:Many] 
    static mapping = { 
     manyCollection(column:"ONE_ID") 
    } 

} 

jedoch ändern, wenn ich laufen

One one = new One() 
one.addToManyCollection(new Many()) 

one.save() 

ich in der Konsole

insert 
into 
    one 
    (id, version) 
values 
    (null, ?) 

insert 
into 
    many 
    (id, version) 
values 
    (null, ?) 

insert 
into 
    one_many 
    (one_many_collection_id, many_id) 
values 
    (?, ?) 

Hinweis Grails cr eate eine joinTable namens one_many. Also, meine Frage: Es ist ein Bug oder etwas anderes? Was soll ich tun, um die JoinTable loszuwerden?

Auch wenn ich so etwas wie

class One { 

    static hasMany = [manyCollection:Many] 
    static mapping = { 
     manyCollection(joinTable:false) 
    } 

} 

wie hervorgehoben verwenden here, erhalte ich die gleiche Ausgabe

Antwort

10

Sie sind fast da, Sie haben 2 Hälften des Mappings, aber Sie brauchen beide, damit es richtig funktioniert. Es ist kein gut dokumentiertes Feature, aber ich habe es schon vorher benutzt und es funktioniert definitiv (z. B. keine Join-Tabelle). Also in Ihrer Einer Klasse,

class One { 
    .. 
    static mapping = { 
    manyCollection column: "ONE_ID", joinTable: false 
    } 
} 

HINWEIS: es ist wahrscheinlich eine gute Idee, um zu beenden, sauber und Grails neu starten, wenn Mapping-Änderungen vorzunehmen. Ich habe viele Stunden damit verloren, meinen Kopf zu schlagen, wenn ein einfaches Grillen die Lösung war.

Auch könnten Sie technisch belongsToohne Rückverweis in Ihren vielen Klasse hinzufügen, und Sie würden immer noch eine echte unidirektionalen aber mit dem zusätzlichen Vorteil der Aktion Kaskadierung (in einer Klasse zugeordnet), wenn es etwas, das Sie ist benötigen .

+0

Die Referenzdokumentation ist falsch. ** Wir sollten joinTable verwenden: false ** anstelle der Spalte. Wenn ich nur die in der Dokumentation angegebene Spalte verwende, wird eine JoinTable erstellt. –

0

Die folgende Setup implementieren, was Sie reden über:

class One { 
    static hasMany = [manyCollection: Many] 
} 

class Many { 
    static belongsTo = [one: One] 
} 

Wenn Sie Möchten Sie die vielen löschen, wenn sie aus der Sammlung entfernt werden, fügen Sie hinzu:

class One { 
     static mapping = { 
      manyCollection cascade: 'all-delete-orphan' 
     } 
    } 
+0

Ihre Lösung ist eine bidirektionale Beziehung, NICHT eine unidirektionale –

Verwandte Themen