所有这些都在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()实现包括一个从不应该更改的字段,但是由于需求的增加,现在该字段正在更改,并且这些方法从未得到正确的更新。

10-06 10:06