从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()删除任何其他对象一样删除该关系。阅读此帖子应该会有所帮助。感谢您的回答,我不是要删除数据库中的实际运动,只是删除类别和(超过)之间的关系相关运动之一。