当在我疯狂的宇宙间可以有很多椅子和椅子可以“属于”到很多房间走走参照完整性约束违规“。 在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