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