所有这些都在Grails 2.2.3上。
我有一对多关系中的两个类,以及一个删除ID列表的服务
class Box {
String name
static hasMany = [items:ItemDomain]
static constraints = {
items(nullable:true)
}
}
和
class ItemDomain { String name Box box
static belongsTo = Box
static constraints = {
name(blank:false,unique:['box'], maxSize:127)
box(nullable:false) } }
在服务中,这是问题部分:
def itemsToDelete = params.itemsToDelete //List of DB ids
List<ItemDomain> items= []
items.addAll(box.items) //Copy the list to avoid concurrent mod exception
for(ItemDomain item : items)
{
if(itemsToDelete.contains(item.id))
{
box.removeFromItems(item)
item.delete()
}
box.save(flush: true)
}
运行该应用程序时,此方法工作正常,但从集成测试中,它失败并显示
InvalidDataAccessApiUsageException: deleted object would be re-saved by cascade (remove deleted object from associations)
如果我取出冲洗,最终它将失败并显示:
Field error in object 'mypackage.ItemDomain' on field 'box': rejected value [null];
添加日志记录后,我看到进入循环之前box.items的大小与退出循环之后相同,在循环之前和之后打印循环中的项目时,显示已删除项目的item.box字段变为null。我尝试弄乱父类中的级联映射...对于执行错误还是集成测试存在问题,我一无所知。我发现的唯一类似问题是针对grails 1.1,并且在我发现的线程中没有解决方案。
我感谢任何反馈。
最佳答案
因此,毫不奇怪,我做错了什么。事实证明,我在ItemDomain类上的equals()和hashCode()实现包括一个从不应该更改的字段,但是由于需求的增加,现在该字段正在更改,并且这些方法从未得到正确的更新。