从Grails一对多关系中删除多个项

从Grails一对多关系中删除多个项,grails,many-to-many,Grails,Many To Many,我正在使用grails2.2.4和java7创建一个应用程序(这些都是我无法更改的约束),当我试图删除多对多hasMany集合中的多个条目时,我遇到了一个奇怪的行为 我有一个名为Sport的类,它包含以下内容: Class Sport{ String name static hasMany=[category:Category] static belongsTo = [Category] } 还有一个名为Category: Class Categ

我正在使用
grails2.2.4
java7
创建一个应用程序(这些都是我无法更改的约束),当我试图删除多对多hasMany集合中的多个条目时,我遇到了一个奇怪的行为

我有一个名为
Sport
的类,它包含以下内容:

    Class Sport{
    String name
    static hasMany=[category:Category]
    static belongsTo = [Category]
    }
还有一个名为
Category

    Class Category{
    String name
    static hasMany=[sports:Sport]
    }
现在,当我在我的
CategoryController
中尝试从
sports
中删除多个
Sport
实例时,我的代码编译并运行时没有出现错误,但由于某些原因,实际上只删除了一个选定实例

如果我从表单中获得
Sport
列表和
Category
id,并尝试在列表中的每个对象上运行以下代码:

    def categoryInstance = Category.get(idCategory)
    def sportInstance = Sport.get(idSport)
    if(sportInstance!=null){
        categoryInstance.removeFromSports(sportInstance)
    }
     categoryInstance.save()
只删除最后一个实例

如果我跑

    def categoryInstance = Category.get(idCategory)
    def sportInstance = Sport.get(idSport)
    if(sportInstance!=null){
        categoryInstance.removeFromSports(sportInstance)
     categoryInstance.save()
     }
只有第一个被删除

请注意,此代码在
params.sport.toList()
列表上的
for
循环中运行

我的猜测是,这可能是因为我的运动集在第一次删除后以某种方式“更改”,因此Hibernate找不到下一个实例,或者我的保存方法提交了第一个更改,然后“忘记”了下一个


关于如何一次删除多个实例,有什么建议吗?

一种解决方法是将用于删除单个关联的代码包装在withNewSession+withNewTransaction块中

Sport.withNewSession {
    Sport.withNewTransaction {
        //delete 1 association here
    }
}
它不是很优雅,但很管用。请注意潜在的性能影响,因为这可能会造成许多数据库往返。 我不知道为什么会出现这个问题,谷歌搜索也没有帮助


另一个解决方案=解决方法是将关系显式映射为SportCategory,然后您可以像使用SportCategory.delete()删除任何其他对象一样删除该关系。

阅读此帖子应该会有所帮助。感谢您的回答,我不是要删除数据库中的实际运动,只是删除类别和(超过)之间的关系相关运动之一。