Nel mio universo pazzo, una stanza può avere molte sedie e sedie che possono "appartenere" a molte stanze. In Grails sembra così. Le sedie non dovrebbero sapere a quale stanza appartengono.Ottenere "violazione del vincolo di integrità referenziale" durante l'eliminazione dell'oggetto dominio
class Room {
String name
static hasMany = [chairs: Chair]
static constraints = {
}
}
class Chair {
String name
static constraints = {
}
}
voglio eliminare una sedia e rimuovere tutti i riferimenti di sedie in tutti gli oggetti di dominio camera che hanno quel sedia automaticamente. Sono riuscito, ma con una correzione che non mi piace. Nel ChairController ho fatto la seguente
def deleleChair(){
def chairToDelete = Chair.get(params.id)
Room.findAll().each {room->
if(room.chairs.contains(chairToDelete)){
room.removeFromChairs(chairToDelete)
room.save(failOnError:true)
}
}
chairToDelete.delete(params.chairId)
}
C'è una configurazione di ibernazione che ho bisogno di impostare in modo che lo fa automaticamente? Sembra una cosa molto comune negli scenari del mondo reale. Non vorrei implementare lo stesso pezzo di codice, quando probabilmente deciderò (esempio più pazzo) che un oggetto dominio Car può avere molte sedie.
Ho provato a utilizzare il plugin push dell'evento Grails. Ho avuto un ChairService con un'azione che ha ascoltato gli eventi beforeDelete in gorm.
class ChairService {
@grails.events.Listener(topic = 'beforeDelete', namespace = "gorm")
def handleDeletedChair(Chair chair){
Room.findAll().each {room->
if(room.chairs.contains(chairToDelete)){
room.removeFromChairs(chairToDelete)
room.save(failOnError:true, flush:true)
}
}
}
}
Questa funzione viene chiamata ogni volta che una sedia eliminare è tentato, ma quando si tornare alla ChairController in modo da fare la cancellazione sedia reale, l'azione di eliminazione pensa ancora che il riferimento alla camera è ancora lì e getta una
Caused by JdbcSQLException: Referential integrity constraint violation:"FK4ACA6A6151428364: PUBLIC.ROOM_CHAIR FOREIGN KEY(CHAIR_ID) REFERENCES PUBLIC.CHAIR(ID)"; SQL statement:
eliminare dalla sedia dove id =? e versione =? [23503-164]
Voglio che questa logica sia separata dalla sedia, la sedia non dovrebbe mai parlare delle stanze.
Se non ti importa che la Sedia possa vedere Camera, tutto diventa molto più facile. – Gregg