从Grails One to Many关系中删除多个项目

时间:2014-04-29 11:48:53

标签: grails many-to-many

我正在使用Grails 2.2.4Java 7创建一个应用程序(这些是我无法更改的约束),当我尝试删除多对多hasMany中的多个条目时,我遇到了一个奇怪的行为设置。

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

    Class Sport{
    String name
    static hasMany=[category:Category]
    static belongsTo = [Category]
    }

另一个名为Category

    Class Category{
    String name
    static hasMany=[sports:Sport]
    }

现在,当我CategoryController尝试从Sport删除多个sports实例时,我的代码编译并运行没有错误,但由于理由,实际上只删除了一个选定的实例

如果我从表单中获取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()
     }

只删除第一个。

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

我的猜测是,这要么是因为我的体育套装在第一次删除后以某种方式“改变”,因此Hibernate无法找到下一个实例,或者我的保存方法提交第一个更改然后“忘记” “下一个。

关于如何一次删除多个实例的任何建议?

1 个答案:

答案 0 :(得分:0)

解决方法是在withNewSession + withNewTransaction

的块中包装用于删除单个关联的代码
Sport.withNewSession {
    Sport.withNewTransaction {
        //delete 1 association here
    }
}

它不是很优雅但有效。请注意潜在的性能影响,因为这可能会有许多数据库往返。 我不知道为什么会出现这个问题,谷歌搜索也没有帮助。

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