Dieser ist für die Grails-Benutzer hier. Ich habe es auf der Grals-User-Mailing-Liste gefragt, aber ich dachte mir, da ich seit ein paar Tagen damit zu kämpfen habe, sollte ich so weit wie möglich ein Netz werfen.Grails - mehrfache selectsTo der gleichen Klasse mit kaskadierender Löschung
Ich habe einige Schwierigkeiten mit dem Versuch, Beziehungen zwischen zwei Objekte des gleichen Typs in einem anderen Objekt (anderer Typ) zu referenzieren die zwei Objekte.
Als ein Beispiel für das, was ich versuche zu tun, nehmen Sie Sie modellieren Beziehungen zwischen Familienmitgliedern. Jede gegebene Beziehung "gehört zu" zwei verschiedenen Familienmitgliedern. Also:
class Person {
hasMany[relationships: Relationship]
static mappedBy = [relationships:'p1', relationships:'p2']
}
class Relationship {
Person p1
Person p2
String natureOfRelationship // for example, "cousins"
static belongsTo = [p1: Person, p2: Person]
}
Die Absicht dabei ist, dass, wenn entweder P1 oder P2 gelöscht wird, dann wird der löscht Kaskade an alle Beziehungs Objekte in der hasMany Karte. Stattdessen versuche ich jedes Mal, wenn ich es versuche, am Ende mit einer Fremdschlüsselverletzung. Ich versuchte, die „Kaskade“ Attribut wie in der Dokumentation behandelt:
http://grails.org/doc/1.0.x/guide/single.html#5.5.2.9%20Custom%20Cascade%20Behaviour
Also dachte ich, dass ich dies auf die Person-Klasse hinzufügen würde:
static mapping = {
relationships cascade:'delete'
}
ich kein Glück hatte damit auch.
Ich schaute auch auf die devDB.script-Datei, die Grails generiert, um zu sehen, wie es die Fremdschlüssel auf Beziehung eingerichtet wurde. Wenn ich manuell "ON DELETE CASCADE" zu beiden Fremdschlüsseleinschränkungen hinzufügen, dann funktioniert es gut, aber offensichtlich manuelle Änderungen an einem automatisch generierten Datenbankskript tun ist nicht die robusteste Lösung. Im Idealfall möchte ich dieses Verhalten mit GORM angeben können.
Also was ist meine beste Wette hier? Gibt es eine Möglichkeit, kaskadierende Löschungen auf mehrere Fremdschlüssel/Eigentümer zu erzwingen? Müsste ich dies manuell mit einer onDelete Aktion auf Person tun? Muss ich in Hibernate Configs für dies, oder kann ich es in Grails/GORM irgendwie tun?
Vielen Dank für Ihre Zeit und für jede Unterstützung, die Sie anbieten können.
dave, wie hast du am Ende diese Lösung? Ich denke sogar der Code von: static mappedBy = [Beziehungen: 'p1', Beziehungen: 'p2'] ist problematisch –