use*_*106 6 sql grails hibernate
在我疯狂的宇宙中,一个房间可以有许多椅子和椅子可以"属于"许多房间.在grails中它看起来像这样.椅子不应该知道他们属于哪个房间.
class Room {
String name
static hasMany = [chairs: Chair]
static constraints = {
}
}
class Chair {
String name
static constraints = {
}
}
Run Code Online (Sandbox Code Playgroud)
我想删除一把椅子,并自动删除所有拥有该椅子的房间域对象中的椅子参考.我成功了,但有一个我不喜欢的修复.在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)
}
Run Code Online (Sandbox Code Playgroud)
我需要设置一个hibernate配置,以便它自动执行此操作吗?在现实世界的场景中,它似乎很常见.我不想实现相同的代码,当我可能决定,(更疯狂的例子)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)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
每当尝试删除主席时都会调用此函数,但是当它返回到ChairController以便执行实际主席删除时,删除操作仍然认为对Room的引用仍然存在并抛出
Caused by JdbcSQLException: Referential integrity constraint violation:"FK4ACA6A6151428364: PUBLIC.ROOM_CHAIR FOREIGN KEY(CHAIR_ID) REFERENCES PUBLIC.CHAIR(ID)"; SQL statement:
Run Code Online (Sandbox Code Playgroud)
从椅子上删除id =?和版本=?[23503-164]
我希望这个逻辑与主席分开,主席永远不应该关于房间.
一个简单的解决方案是使用标准 SQL:
import grails.events.Listener
import groovy.sql.Sql
class ChairService {
def dataSource // autowired
@Listener(topic='beforeDelete', namespace='gorm')
def handleDeletedChair(Chair chairToDelete) {
new Sql(dataSource).execute('DELETE FROM room_chair WHERE chair_id=?', [chairToDelete.id])
return true
}
}
Run Code Online (Sandbox Code Playgroud)
由于这是 SQL,它可能取决于您使用的数据库(我使用 H2 进行了测试)。