Все это на Grails 2.2.3.grails removeFrom не работает в тесте интеграции
У меня есть два класса, в связи один-ко-многим, и сервис, который удаляет список идентификаторов
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 и не имели разрешения в тех нитях, которые я нашел.
Я ценю любую обратную связь.
Сначала удалите из окна, затем сохраните поле, а затем удалите элемент. –