所有这些都在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字段更改为空。我已经尝试搞乱父类中的级联映射...我不知道我是在做错了什么,或者这是否是集成测试的问题。我发现的唯一类似问题是针对grails 1.1,并且在我发现的帖子中没有解析。
我感谢任何反馈。
答案 0 :(得分:0)
所以,毫不奇怪,我做错了什么。事实证明,我在ItemDomain类上的equals()和hashCode()实现包括一个永远不会改变的字段,但由于需求蠕变,现在正在改变,方法永远不会得到正确的更新。