To pytanie składa się z dwóch części, pierwsza część dotyczy czyszczenia listy, a druga dotyczy przypisania właściciela do obiektu.Jak wyczyścić i zastąpić kolekcję w relacji jeden do wielu w Grails/Groovy
Mam relacji jeden do wielu między obiektami domeny w moim modelu w Grails. Relacja wygląda tak ...
class Person {
static hasMany = [authorities: Role, locations: Location]
}
class Location {
static belongsTo = Person
}
W moim app lista locations
na Person
ją całkowicie odświeżony i zastąpiona nową listę na działania użytkownika. Co więcej dostaję listę obiektów Location
niezależnie od powiązanego Person
. Postanawiam, do której osoby je zastosować, pobierając aktualnie zalogowanego użytkownika, który nazywam activePerson
i jest w porządku dla moich celów.
Co chcę zrobić, to usunąć wszystkie istniejące lokalizacje na activePerson
i wstawić wszystkie nowe, wiążąc je z activePerson
. Mam kilka właściwości na Person
, których nie chcę trwać w tym momencie, więc chcę uniknąć zapisywania całego obiektu nadrzędnego tylko dlatego, że zmieniły się lokalizacje dzieci.
Pomyślałem o powtórzeniu listy activePerson.locations
i usunięciu ich pojedynczo i poleganiu na GORM/Hibernate w celu grupowania zapytań i wypróżniania na końcu. To wydaje się brutalną siłą, chociaż może się udać. Spodziewałem się, że będzie metoda clearLocations
lub coś podobnego, ale nie mogę jej znaleźć.
Jeśli po prostu zastąpię activePerson.locations
nową listą i zadzwonię pod numer activePerson.save(flush:true)
, czy GORM obsłuży usunięcie istniejących wierszy?
Po drugie chcę umieścić nowe obiekty Location
na activePerson
. Ponownie mogę zapełnić activePerson.locations
i uratować całość, ale chciałbym tego uniknąć, jeśli mogę. Mogę je zapisać pojedynczo, ale jak ustawić belongsTo
na każdym obiekcie ?
Przypomnę więc:
- Jak wyczyścić listę w wielu końcu kolekcji jeden-do-wielu?
- Jak powiązać niezależne obiekty z obiektem nadrzędnym i utrzymywać je pojedynczo?
Dzięki
@Burt, dzięki (znowu) za odpowiedź, jestem ci winien piwo. To jednak sugeruje, że muszę utrzymywać obiekt Person, którego starałem się uniknąć. Czy istnieje sensowna alternatywa, czy powinienem po prostu żyć z aktualizowaniem rekordu, który tak naprawdę się nie zmienił? – Simon
Oprócz odpowiedzi Burta, konieczne może być zaimplementowanie equals i hashcode w obiekcie kolekcji oraz określenie kaskady: "all-delete-orphan" w odwzorowaniu kolekcji. –
'activePerson.locations.clear()' na kolekcji nie działa. Spróbuj: 'activePerson.locations.collect(). Each {item.removeFromLocations (it)}' – Athlan