2014-02-19 2 views
0

Проект 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) 

Я думаю, что корень случай вопроса объект, связанный с удаленным Первым объектом все еще содержит в памяти (в кэше или что-то другое) и прежде чем что-то с этим поделать, но я не знаю, что.

ответ

0

Если вы удалите Firsts with HQL тоже, они не будут загружены, поэтому вы, конечно же, не получите исключение, связанное с каскадом.

+0

Я не могу этого сделать, потому что мне нужно удалить Cascading, у первого класса есть и другие классы, сохраненные в БД – user1680222

Смежные вопросы