父级的Grails级联删除是逐个删除子记录

时间:2015-03-25 02:14:51

标签: grails gorm

使用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以这种方式运行的内容?

1 个答案:

答案 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,其中列出了您应避免使用集合的其他原因。