grails removeFrom不在Integration Test中工作

时间:2013-09-23 15:05:23

标签: grails integration-testing

所有这些都在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,并且在我发现的帖子中没有解析。

我感谢任何反馈。

1 个答案:

答案 0 :(得分:0)

所以,毫不奇怪,我做错了什么。事实证明,我在ItemDomain类上的equals()和hashCode()实现包括一个永远不会改变的字段,但由于需求蠕变,现在正在改变,方法永远不会得到正确的更新。