gpt4 book ai didi

sql - 删除域对象时获取 'Referential integrity constraint violation'

转载 作者:行者123 更新时间:2023-12-04 15:46:13 26 4
gpt4 key购买 nike

在我疯狂的宇宙中,一个房间可以有很多椅子,椅子可以“属于”很多房间。
在 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)
}

是否有我需要设置的 hibernate 配置以便它自动执行此操作?这在现实世界的场景中似乎很常见。我不想实现同一段代码,当我可能决定(更疯狂的例子)一个 Car 域对象可以有很多椅子时。

我曾尝试使用 grails 事件推送插件。我有一个带有一个 Action 的 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 以进行实际的椅子删除时,删除操作仍然认为对 Room 的引用仍然存在并抛出一个
 Caused by JdbcSQLException: Referential integrity constraint    violation:"FK4ACA6A6151428364: PUBLIC.ROOM_CHAIR FOREIGN KEY(CHAIR_ID) REFERENCES PUBLIC.CHAIR(ID)"; SQL statement:

从椅子上删除 id=?和版本=? [23503-164]

我希望这个逻辑与椅子分开,椅子永远不应该与房间无关。

最佳答案

因为这种关系不是双向存在的,所以我不确定是否有更优雅的解决方案。

但是,如果您要处理很多房间/椅子,我建议您使用带有投影的标准查询来仅加载要删除的 ID,而不是将所有房间都加载到椅子上。 更好使用 executeUpdate进行“批量”删除的方法。这样做也应该有助于解决您的错误。

grails criteria query docs...

deleting objects in grails docs...

关于sql - 删除域对象时获取 'Referential integrity constraint violation',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13724538/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com