使用Grails 2.4.4,休眠4.3.6.1插件...Grails的級聯刪除父刪除子記錄逐一
我們必須使用與父/子一個一對多關係的域對象一個hasMany/belongsTo。刪除父記錄時,Grails將刪除級聯到子記錄。但是,在查看SQL時,我發現Grails正在提取子記錄,並使用delete ... where id = ? and version = ?
一個接一個地刪除子記錄。這是刪除子記錄的非常低效的方法,我確信Grails didn當我最初編寫這段代碼時(我找不到任何明確導致這種行爲的東西),就不要這樣做。
我希望Grails的/ Hibernate來運行一個查詢更像:
delete from Child where parent_id = ?
讓所有的孩子都記錄在刪除一個查詢,而不是成千上萬的查詢。
映射/配置中是否存在會導致Grails以這種方式運行的內容?
我很確定,因爲您正在使用樂觀鎖定(例如,您沒有禁用版本)您的子實例,它必須檢查每個實例的版本,並因此一次刪除它們。這是使用GORM時的許多問題之一。 – 2015-03-25 02:36:18
有趣的是,我當然可以禁用樂觀鎖定,看看它是否會改變行爲。一般來說,我認爲樂觀鎖定無論如何都是一種錯誤的安全感。 – Aaron 2015-03-25 02:39:01
因此,除去從delete語句中刪除'version =?'部分,除去樂觀鎖定沒有任何影響。 – Aaron 2015-03-25 03:34:59