使用Grails 2.4.4,Hibernate 4.3.6.1插件......
我们有一个使用hasMany / belongsTo的父/子一对多关系的域对象。删除父记录时,Grails将删除级联到子记录。但是,在查看SQL时,我看到Grails正在获取子记录并使用delete ... where id = ? and version = ?
逐个删除它们
这是删除子记录的一种非常低效的方式,我相当确定Grails在我最初编写此代码时没有这样做(我无法找到任何特定导致此行为的内容) )。
我希望Grails / Hibernate更像是运行查询:
delete from Child where parent_id = ?
这样所有子记录都在一个查询中删除,而不是数千个查询。
mappings / config中是否存在导致Grails以这种方式运行的内容?
答案 0 :(得分:1)
在事务服务方法中显式删除子对象和父对象很容易。删除hasMany
集合,并将belongsTo
转换为常规属性,例如
class Author {
String name
}
和
class Book {
String title
Author author
}
然后您可以在两个查询中有效地删除书籍和作者:
void deleteAuthor(Author a) {
Book.where { author == a }.deleteAll()
a.delete()
}
观看this presentation,其中列出了您应避免使用集合的其他原因。