Проект Grails/Groovy с классами домена Hibernate и тестами интеграции. У меня есть два класса:Запрос на обновление HQL в критериях интеграции grails
First{
id
SomeClassAlsoSevaedInDB porp1
SomeClassAlsoSevaedInDB porp2
String somefield;
}
Second {
id
First first
String somefield2;
}
Я хочу, чтобы удалить только объект первого типа, из-за меня около 20kk Первые объекты в БД, я исполню HSQL заявление как
firstToDelete = [1,2,3]
Second.executeUpdate("Update Second set first = null where first.id in (1,2,3)")
First.findAllByIdInList(firstToDelete)*.delete()
С таким поведением я есть ошибка:
deleted object would be re-saved by cascade (remove deleted object from associations): [First]
Если я переключить HQL запрос для обновления объектов второй работает отлично
Second.findAllByFirstInList(First.findAllByIdInList(firstToDelete)).each {
it.first = null
it.save()
}
First.findAllByIdInList(firstToDelete)*.delete() // works fine
Но мне нужен HQL для лучшего Perfomance
Я попытался сделать это:
def listSecond = Second.findAllByFirstInList(First.findAllByIdInList(firstToDelete))
Second.executeUpdate("Update Second set first = null where first.id in (1,2,3)")
First.findAllByIdInList(firstToDelete)*.delete()
println listSecond.first // return Not Empty list(should be empty)
Я думаю, что корень случай вопроса объект, связанный с удаленным Первым объектом все еще содержит в памяти (в кэше или что-то другое) и прежде чем что-то с этим поделать, но я не знаю, что.
Я не могу этого сделать, потому что мне нужно удалить Cascading, у первого класса есть и другие классы, сохраненные в БД – user1680222