Questa domanda è divisa in due parti, la prima parte riguarda la cancellazione di una lista e la seconda parte riguarda l'assegnazione di un proprietario a un oggetto.Come svuotare e sostituire una raccolta in una relazione uno-a-molti in Grails/Groovy
Ho una relazione uno-a-molti tra due oggetti dominio nel mio modello in Grails. Il rapporto si presenta così ...
class Person {
static hasMany = [authorities: Role, locations: Location]
}
class Location {
static belongsTo = Person
}
Nella mia app lista locations
su Person
ottiene completamente rinnovato e sostituito con un nuovo elenco su un azione dell'utente. Inoltre, viene visualizzato l'elenco degli oggetti Location
indipendentemente dallo Person
associato. Risolvo a quale persona applicarli recuperando l'utente attualmente connesso, che io chiamo activePerson
e va bene per i miei scopi.
Quello che voglio fare è eliminare tutte le posizioni esistenti su activePerson
e inserire tutte quelle nuove, associandole allo activePerson
mentre procedo. Ho un sacco di proprietà su Person
che non voglio mantenere a questo punto, quindi voglio evitare di salvare l'intero oggetto genitore solo perché le posizioni dei bambini sono cambiate.
Ho pensato di iterare attraverso l'elenco activePerson.locations
e di eliminarli uno per uno e basandomi su GORM/Hibernate per raggruppare le query insieme e svuotare alla fine. Sembra una forza bruta, anche se potrebbe funzionare. Mi aspettavo che ci fosse un metodo clearLocations
o qualcosa di simile, ma non riesco a trovarne uno.
Se si sostituisce semplicemente lo activePerson.locations
con un nuovo elenco e si chiama activePerson.save(flush:true)
, GORM gestirà l'eliminazione delle righe esistenti?
In secondo luogo voglio mettere i nuovi oggetti Location
su activePerson
. Ancora una volta potrei popolare lo activePerson.locations
e salvare il tutto, ma vorrei evitarlo se posso. Posso salvarli individualmente, ma come faccio a impostare belongsTo
su ogni oggetto Location
mentre procedo?
Quindi, per ricapitolare:
- Come posso eliminare un elenco alla fine molti di una collezione uno-a-molti?
- Come associo oggetti indipendenti con un oggetto padre e li conservo singolarmente?
Grazie
@ Burt, grazie (ancora) per la risposta, ti devo una birra. Ciò implica tuttavia che devo mantenere l'oggetto Person, che stavo cercando di evitare. C'è un'alternativa ragionevole o dovrei semplicemente vivere con l'aggiornamento di un disco che non è davvero cambiato? – Simon
Oltre alla risposta di Burt, potrebbe essere necessario implementare equals e hashcode sull'oggetto di raccolta e specificare cascade: "all-delete-orphan" sul mapping della raccolta. –
'activePerson.locations.clear()' sulla raccolta non funziona. Prova: 'activePerson.locations.collect(). Each {item.removeFromLocations (it)}' – Athlan