Diese Frage besteht aus zwei Teilen, der erste Teil ist über das Löschen einer Liste und der zweite Teil über das Zuweisen eines Eigentümers zu einem Objekt.Wie lösche und ersetze ich eine Sammlung in einer Eins-zu-viele-Beziehung in Grails/Groovy
Ich habe eine Beziehung zwischen zwei Domäne-Objekten in meinem Modell in Grails eine Eins-zu-viele Beziehung. 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 erneuert und mit einer neuen Liste auf eine Aktion des Benutzers ersetzt. Was mehr ist, bekomme ich die Liste der Location
Objekte unabhängig von der zugehörigen Person
. Ich entscheide, welche Person sie anwenden soll, indem ich den aktuell angemeldeten Benutzer abrufe, den ich activePerson
rufe und für meine Zwecke in Ordnung ist.
Was ich tun möchte, ist alle vorhandenen Positionen auf activePerson
löschen und fügen Sie alle neuen hinzu, sie mit der activePerson
assoziieren, wie ich gehe. Ich habe eine Reihe von Eigenschaften auf Person
, die ich an dieser Stelle nicht beibehalten möchte, also möchte ich vermeiden, das gesamte Elternobjekt zu speichern, nur weil Standorte Kinder geändert haben.
Ich dachte daran, die activePerson.locations
Liste zu durchlaufen und sie nacheinander zu löschen und auf GORM/Hibernate angewiesen zu sein, die Abfragen zusammenzufassen und am Ende zu bündeln. Dies scheint wie rohe Gewalt, obwohl es funktionieren könnte. Ich habe erwartet, dass es eine clearLocations
Methode oder etwas ähnliches gibt, aber ich kann keine finden.
Wenn ich nur die activePerson.locations
durch eine neue Liste ersetzen und activePerson.save(flush:true)
aufrufen, wird GORM das Löschen der vorhandenen Zeilen behandeln?
Zweitens möchte ich die neuen Location
Objekte auf activePerson
setzen. Wieder konnte ich die activePerson.locations
bevölkern und das Ganze retten, aber ich würde das gerne vermeiden, wenn ich kann. Ich kann sie einzeln speichern, aber wie setze ich belongsTo
auf jedes Location
Objekt, wie ich gehe?
So zu rekapitulieren:
- Wie lösche ich eine Liste an der viele Ende einer Eins-zu-viele-Sammlung?
- Wie verknüpfe ich unabhängige Objekte mit einem übergeordneten Objekt und behalte sie einzeln?
Dank
@Burt, danke (nochmal) für deine Antwort, ich schulde dir ein Bier. Dies bedeutet jedoch, dass ich das Person-Objekt beibehalten muss, was ich vermeiden wollte. Gibt es eine vernünftige Alternative oder sollte ich nur mit der Aktualisierung eines Datensatzes leben, der sich nicht wirklich verändert hat? – Simon
Zusätzlich zu Burt's Antwort müssen Sie möglicherweise equals und hashcode für das Sammlungsobjekt implementieren und kaskade angeben: "all-delete-orphan" für die Zuordnung der Sammlung. –
'activePerson.locations.clear()' auf der Sammlung wird nicht funktionieren. Versuchen Sie: 'activePerson.locations.collect(). Je {item.removeFromLocations (it)}' – Athlan