? Esta pregunta consta de dos partes, la primera parte se trata de borrar una lista y la segunda parte se trata de asignar un propietario a un objeto.¿Cómo elimino y reemplazo una colección en una relación de uno a muchos en Grails/Groovy
Tengo una relación uno a muchos entre dos objetos de dominio en mi modelo en Grails. La relación se ve así ...
class Person {
static hasMany = [authorities: Role, locations: Location]
}
class Location {
static belongsTo = Person
}
En mi aplicación en la lista locations
Person
queda completamente renovado y reemplazado con una nueva lista en una acción del usuario. Además, obtengo la lista de los objetos Location
independientes del Person
asociado. Resuelvo a qué persona aplicarlos recuperando el usuario actualmente conectado, al que llamo activePerson
y está bien para mis propósitos.
Lo que quiero hacer es eliminar todas las ubicaciones existentes en activePerson
e insertar todas las nuevas, asociándolas con el activePerson
sobre la marcha. Tengo un montón de propiedades en Person
que no quiero que persistan en este momento, así que quiero evitar guardar todo el objeto principal solo porque las ubicaciones de los elementos han cambiado.
Pensé en iterar a través de la lista activePerson.locations
y eliminarlos uno por uno y confiar en GORM/Hibernate para agrupar las consultas en conjunto y vaciar al final. Esto parece una fuerza bruta, aunque podría funcionar. Esperaba que hubiera un método clearLocations
o algo similar, pero no puedo encontrar uno.
Si solo reemplazo el activePerson.locations
con una nueva lista y llame al activePerson.save(flush:true)
, ¿GORM manejará la eliminación de las filas existentes?
En segundo lugar, quiero poner los nuevos objetos Location
en . Una vez más pude llenar el activePerson.locations
y guardar todo, pero me gustaría evitar eso si puedo. Puedo guardarlos individualmente, pero ¿cómo configuro belongsTo
en cada objeto Location
mientras voy?
Así que para recapitular:
- ¿Cómo se borra una lista en la que muchos terminan de una colección de uno a muchos?
- ¿Cómo puedo asociar objetos independientes con un objeto primario y persistirlos individualmente?
Gracias
@Burt, gracias (de nuevo) por su respuesta, le debo una cerveza. Sin embargo, esto implica que tengo que persistir en el objeto Persona, que estaba tratando de evitar. ¿Existe una alternativa sensata o debería simplemente vivir con la actualización de un registro que realmente no ha cambiado? – Simon
Además de la respuesta de Burt, puede que necesite implementar equals y hashcode en el objeto de colección, y especifique cascade: "all-delete-huérfano" en la asignación de la colección. –
'activePerson.locations.clear()' en la colección no funcionará. Pruebe: 'activePerson.locations.collect(). Each {item.removeFromLocations (it)}' – Athlan