1

所有这些都在 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 并且在我发现的线程中没有解决方案。

我很感激任何反馈。

4

1 回答 1

0

所以,毫不奇怪,我做错了什么。事实证明,我在 ItemDomain 类上的 equals() 和 hashCode() 实现包含一个本不应该更改的字段,但由于需求蔓延,现在正在更改,并且方法从未正确更新。

于 2013-09-23T16:14:18.023 回答