當在我瘋狂的宇宙間可以有很多椅子和椅子可以「屬於」到很多房間走走參照完整性約束違規「。 在grails中看起來像這樣。椅子不應該知道他們屬於哪個房間。刪除域對象
class Room {
String name
static hasMany = [chairs: Chair]
static constraints = {
}
}
class Chair {
String name
static constraints = {
}
}
我想要刪除椅子並自動刪除所有具有該椅子的房間域對象中的椅子引用。 我已經成功,但有一個我不喜歡的修復程序。在ChairController我做了以下
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)
}
是否有一個休眠配置,我需要設置,以便它自動執行此操作?這似乎是在現實世界中非常普遍的情況。當我可能決定時,我不想實現同一段代碼(瘋狂的例子),一個Car域對象可以有多個椅子。
我曾嘗試使用Grails事件推插件。我有一個ChairService,在gorm中偵聽beforeDelete事件。
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)
}
}
}
}
該功能被稱爲每當椅子刪除嘗試,但當它返回ChairController這樣做實際的椅子上刪除,刪除操作仍然認爲,提及間仍然存在,並拋出一個
Caused by JdbcSQLException: Referential integrity constraint violation:"FK4ACA6A6151428364: PUBLIC.ROOM_CHAIR FOREIGN KEY(CHAIR_ID) REFERENCES PUBLIC.CHAIR(ID)"; SQL statement:
從椅子上刪除其中id =?和版本=? [23503-164]
我想這個邏輯是分開的主席,主席應從來沒有對酒店客房。
如果你不在意主席可以看到房間,這會變得更容易。 – Gregg