Ich habe die folgende Anordnung der Klassen:Reihenfolge der kaskadierten GORM-Speicherung abhängig von Feldnamen? "Ja wirklich?"
class A {
static belongsTo = [c: C]
B b
}
class B {
static belongsTo = [c: C]
}
class C {
static hasMany = [bbs: B, aas: A]
}
Wenn ich jetzt Instanzen dieser Klassen erstellen ...
B b = new B()
A a = new A()
a.b = b
C c = new C()
c.addToBbs(b)
c.addToAas(a)
... und versuchen, c zu retten ...
c.save()
... Ich bekomme eine org.hibernate.TransientObjectException Message object references an unsaved transient instance - save the transient instance before flushing: B
.
Was ich denke GORM ist zuerst zu kaskadieren das Speichern auf c.aas
und dann stolpert über die Instanz a.b
, die noch nicht gespeichert ist. Daher die Ausnahme.
Jetzt der Trick: Wenn ich die aas
Eigenschaft C
-xxs
umbenannt, es funktioniert:
class C {
static hasMany = [bbs: B, xxs: A]
}
b
zuerst, dann a
gespeichert wird. GORM scheint die Saves in lexikographischer Reihenfolge der Felder zu kaskadieren (zuerst bbs
, dann xxs
)!
Wie kann ich die Sequenz steuern, die GORM für die kaskadierende Speicherung verwendet (außer das Umbenennen der Felder, was mir sehr spröde erscheint)?
Dies könnte nicht Ihre genaue Frage beantworten, wurden aber speichert die in einer Transaktion eingewickelt? Ich würde deinen ersten Versuch erwarten zu arbeiten, solange alles transaktional ist. –
Ja. Beim Speichern gab es eine aktive Transaktion. –
Entschuldigung, klicken Sie zu früh auf den Bearbeitungsschaltfläche. Funktioniert es, wenn Sie "c.addToAas (a)" (ohne das c.addToBbs (b)) verwenden? Ich bin mir nicht sicher, ob die Partien auf ein drittes Level fallen werden, aber es lohnt sich. Ich würde auch gerne wissen, ob Gauravs Vorschlag für "cascade: save" funktioniert, aber ich würde nicht erwarten, dass es einen Unterschied macht. Angesichts der Standard-Mapping für hasMany ist "cascade: all".) –