Wie kann ich löschen und ersetzen Sie eine Sammlung in einer eins-zu-viele-Beziehung in Grails/Groovy
Diese Frage ist in zwei Teile, der erste Teil ist über das clearing Liste und der zweite Teil ist über die Zuordnung von Besitzer zu einem Objekt.
Habe ich eine eins-zu-viele-Beziehung zwischen zwei domain-Objekte in meinem Modell in Grails. Die Beziehung sieht wie folgt aus...
class Person {
static hasMany = [authorities: Role, locations: Location]
}
class Location {
static belongsTo = Person
}
In meiner app die locations
Liste auf Person
wird vollständig aktualisiert und ersetzt mit einer neuen Liste auf eine Aktion des Benutzers. Was mehr ist, bekomme ich die Liste der Location
Objekte, unabhängig von der damit verbundenen Person
. Ich löse die person, um Sie anzuwenden, um mit dem abrufen der aktuell angemeldete Benutzer, die ich als activePerson
und ist gut für meine Zwecke.
Was ich will zu tun ist, löschen Sie alle bestehenden Standorte auf activePerson
und legen Sie alle die neuen, assoziierten Sie mit der activePerson
wie ich gehen. Ich habe eine Reihe von Eigenschaften auf Person
was ich nicht wollen, bleiben bei diesem Punkt, so will ich vermeiden, speichern Sie die gesamte übergeordnete Objekt, nur weil Standorte Kinder sich verändert haben.
Dachte ich Durchlaufen durch die activePerson.locations
Liste und löschen Sie eins nach dem anderen und verlassen sich auf GORM/Hibernate batch-Abfragen zusammen und Spülen am Ende. Dies scheint, wie brute-force, obwohl es funktionieren könnte. Ich hatte erwartet, dort zu sein clearLocations
Methode oder etwas ähnliches, aber ich kann Sie nicht finden.
Mache ich, wenn ich ersetzen Sie einfach die activePerson.locations
mit einer neuen Liste und rufen activePerson.save(flush:true)
wird GORM Griff das löschen der vorhandenen Zeilen?
Zweitens möchte ich auf die neuen Location
Objekte auf activePerson
. Wieder konnte ich Auffüllen der activePerson.locations
und speichern Sie die ganze Sache, aber ich möchte vermeiden, dass, wenn ich kann. Ich kann speichern Sie einzeln, aber wie setze ich belongsTo
auf jeden Location
Objekt, wie ich gehen?
So zur Erinnerung:
- Wie lösche ich eine Liste auf der viele Ende einer eins-zu-viele-Sammlung?
- Wie assoziiere ich eigenständige Objekte mit einem übergeordneten Objekt, und speichern Sie Sie einzeln?
Dank
InformationsquelleAutor der Frage Simon | 2010-01-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
#1 Sie können deaktivieren Sie die Sammlung (es ist ein Standard):
#2 verwenden addToLocations:
und wenn Sie die person zu retten. die Lage<->person-Beziehung aktualisiert werden.
InformationsquelleAutor der Antwort Burt Beckwith
Clearing
Collection
Ansatz hat nicht für mich gearbeitet:Nur versuchen iterieren über Kollektion mit der Vermeidung
ConcurrentModificationException
durch den Aufrufcollect()
:Und nachdem das speichern der entity-SQL-Anweisung ausführen:
Link zum Artikel zu Lesen:
http://spring.io/blog/2010/07/02/gorm-gotchas-part-2/
InformationsquelleAutor der Antwort Athlan
Dies ist zwar eine ältere Frage, ich lief in einer sehr ähnlichen situation, in die ich wollte zu aktualisieren, eine Reihe von untergeordneten Datensätze. Hier ist, wie ich wählte, um es zu lösen. Zur Einfachheit verwende ich das gleiche Objekt/relation Namen wie der Fragensteller.
In der
mapping
- block der übergeordneten Domäne hinzufügen:In der untergeordneten Domäne hinzufügen
@EqualsAndHashCode
Anmerkung (nur für den Fall es ist noch ein lauern über, ich beziehe mich aufgroovy.transform.EqualsAndHashCode
).Hinzufügen, dass alle Kinder Elemente der übergeordneten Domäne mithilfe des Grails
addTo
Methoden (z.B.addToLocations
) und speichern Sie die übergeordnete Domäne.Während dieser Ansatz erfordert, speichern die übergeordnete Domäne (die der Fragesteller wollte nicht zu tun), wie es scheint, es ist der geeignetste Ansatz, da eindeutig
belongsTo
definition im Modell. Ich würde deshalb die Antwort, die der Fragesteller numerierten Fragen wie diese:Eher als es manuell zu tun, lassen Grails/Hibernate deaktivieren Sie die Datensätze durch Angabe der
all-delete-oprhan
cascade-Verhalten auf die Beziehung.Versuchen Sie nicht, um das Kind zu retten Unterlagen direkt, sondern speichern Sie das parent-Objekt zu entsprechen, was Grails scheint zu erwarten.
InformationsquelleAutor der Antwort jstricker