2012-04-05 11 views
2

zu behandeln Ich habe eine MyParameter Klasse und eine MyParameterValue Klasse definiert wie folgt:Kraft GORM Eins-zu-eins-Beziehungen als unabhängige

class MyParameter { 
    MyParameterValue defaultValue 

    static belongsTo = [anotherObject: AnotherDomainClass] 
} 

class MyParameterValue { 
    MyParameter valueOf 
} 

Mein Problem ist, dass GORM besteht darauf, dies zu einer Eins-zu behandeln eine Beziehung mit Rückverweis, was ich nicht will. Es hat Auswirkungen auf die Aktualisierung von Parametern.

Beispiel:

def param = new MyParameter(defaultValue: new MyParameterValue()).save() 
    def paramVal = new MyParameterValue (valueOf: param).save() 
    assert param.defaultValue != paramVal 

Dieser Code führt ein AssertionFailure. Also was ist passiert? Obwohl es sollte klar sein, dass ich nicht den Standardwert von param in der zweiten Zeile zu ändern, habe gemeint, aktualisiert GORM es, als ob defaultValue mit valueOf in MyParameterValue, synchronisieren werden mußten tatsächlich

So GORM verwandelt, was ich will:

UML Example of two references in opposite direction

in das:

UML Example of two-sided one-to-one relationship

Hier sind meine zwei Fragen:

  • Was ist der Zweck des hasOne Schlüsselwort, wenn alle Referenzen, die vom Typ Sicht Referenzen aussehen, wie zurück, als ohnehin eine Eins-zu-Eins-Beziehung behandelt werden?
  • Wie kann ich GORM zwingen, valueOf nicht als Rückverweis von defaultValue zu behandeln? Beachten Sie, dass ich das Kaskadierungsverhalten nicht ändern möchte: das Ändern der defaultValue einer MyParameter sollte kaskadiert werden.

aktualisieren

Ich bin oben auf die Frage in einer Antwort noch interessiert. Die Lösung, die ich verwendete, war, Standardwerte ihre eigene Klasse MyDefaultValue zu geben. Wie Sie sich vorstellen können, ist MyParameterValue eine komplizierte Struktur und ich suchte nach einer Möglichkeit, diese Struktur zu duplizieren.

Antwort

0

Wenn Sie keinen Rückverweis nicht mögen, aber alle Beziehungen manuell zu handhaben wollen, ich glaube, ich meine Objekte wie folgt definieren würde:

class MyParameter { 
    MyParameterValue defaultValue 

    static constraints { 
    defaultValue nullable: true 
    } 
} 

class MyParameterValue { 
    MyParameter valueOf 

    static constraints { 
    valueOf nullable: true 
    } 
} 

Dies erfordert jedoch, dass Sie tun das alles plumbin selbst .

+0

OK, mir war nicht bewusst, dass "Nullable" einen Einfluss auf die Rückverweise hat. Ich werde das versuchen. – Antoine

+0

Beachten Sie das Fehlen von AngiesTo – sbglasius

+0

Es gibt keine AngleTo in der Beziehung in meinem Beispiel beteiligt. – Antoine