Cette question est en deux parties, la première partie traite de la suppression d'une liste et la seconde partie concerne l'affectation d'un propriétaire à un objet.Comment effacer et remplacer une collection dans une relation un-à-plusieurs dans Grails/Groovy
J'ai une relation un-à-plusieurs entre deux objets de domaine dans mon modèle dans Grails. La relation ressemble à ceci ...
class Person {
static hasMany = [authorities: Role, locations: Location]
}
class Location {
static belongsTo = Person
}
Dans mon application la liste locations
sur Person
obtient complètement rafraîchi et remplacé par une nouvelle liste sur une action de l'utilisateur. De plus, j'obtiens la liste des objets Location
indépendants du Person
associé. Je décide à quelle personne de les appliquer en récupérant l'utilisateur actuellement connecté, que j'appelle activePerson
et est bien pour mes fins. Ce que je veux faire est de supprimer tous les emplacements existants sur activePerson
et d'insérer tous les nouveaux, en les associant au activePerson
comme je vais. J'ai un tas de propriétés sur Person
que je ne veux pas persister à ce stade, donc je veux éviter d'enregistrer l'objet parent entier juste parce que les emplacements des enfants ont changé.
J'ai pensé à parcourir la liste activePerson.locations
et de les supprimer un par un et de me fier à GORM/Hibernate pour regrouper les requêtes et les rincer à la fin. Cela semble être une force brute, bien que cela puisse fonctionner. Je m'attendais à ce qu'il y ait une méthode clearLocations
ou quelque chose de similaire, mais je ne peux pas en trouver un.
Si je remplace simplement le activePerson.locations
par une nouvelle liste et appelez activePerson.save(flush:true)
, GORM va-t-il gérer la suppression des lignes existantes?
Deuxièmement, je veux mettre les nouveaux objets Location
sur activePerson
. Encore une fois, je pourrais remplir le activePerson.locations
et enregistrer le tout, mais je voudrais éviter cela si je peux. Je peux les enregistrer individuellement, mais comment puis-je définir belongsTo
sur chaque objet Location
comme je vais?
Pour résumer:
- Comment effacer une liste à la fin d'un grand nombre d'un à plusieurs collection?
- Comment associer des objets indépendants à un objet parent et les conserver individuellement?
Merci
@Burt, merci (encore) pour votre réponse, je vous dois une bière. Cela implique cependant que je dois persister l'objet Person, que j'essayais d'éviter. Y a-t-il une alternative raisonnable ou devrais-je simplement vivre avec la mise à jour d'un disque qui n'a pas vraiment changé? – Simon
En plus de la réponse de Burt, vous devrez peut-être implémenter equals et hashcode sur l'objet de collection, et spécifier cascade: "all-delete-orphelin" sur le mappage de la collection. –
'activePerson.locations.clear()' sur la collection ne fonctionnera pas. Essayez: 'activePerson.locations.collect(). Each {item.removeFromLocations (it)}' – Athlan