我正在使用Grails 2.2.4
和Java 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无法找到下一个实例,或者我的保存方法提交第一个更改然后“忘记” “下一个。
关于如何一次删除多个实例的任何建议?
答案 0 :(得分:0)
解决方法是在withNewSession + withNewTransaction
的块中包装用于删除单个关联的代码Sport.withNewSession {
Sport.withNewTransaction {
//delete 1 association here
}
}
它不是很优雅但有效。请注意潜在的性能影响,因为这可能会有许多数据库往返。 我不知道为什么会出现这个问题,谷歌搜索也没有帮助。
另一个解决方案=解决方法是将关系显式映射为SportCategory,然后可以像使用SportCategory.delete()的任何其他对象一样将其删除。