Я немного озадачен тем, как работает каскад = "delete" (...)
Каскадирование операции delete
означает, что если вы delete
родитель, операция будет распространяться по ассоциации.Таким образом, в вашем случае удаление объекта City
должно распространяться на Client
s.
Так что, когда я запускаю (...) Должны ли все клиенты также быть удалены
Метод Session#delete(String)
, который принимает строку запроса HQL , выполняет ее, выполняет итерацию результатов и вызывает Session#delete(Object)
для каждого объекта с учетом каскадирования (поэтому клиенты будут удалены, если вашзапрос на самом деле является запросом HQL).
Но этот метод старый и устарел в Hibernate 3 (и перешел на «классический» интерфейс Session
), я не очень рекомендую его (он выполняет 1+ N операций и довольно неэффективно для удаления огромного количества результатов).
Если это проблема, предпочтите поддержку массового удаления , предлагаемую Hibernate:
int deleteCount = session.createQuery("delete from Foo where bar = :bar")
.setParameter("bar", bar);
.executeUpdate()
Но обратите внимание, что массовое удаление имеет ограничения:
- Вы не можете использовать псевдонимы.
- Нет внутренних объединений в запросе (хотя вы можете использовать подвыборы в предложении where).
- A массовое удаление не каскадно (и не позаботится о соединении таблиц).
Так что при массовом удалении вам придется удалить Client
до City
.Но производительность намного лучше.
PS: В какой-то момент вам нужно commit()
(а также улучшить обработку ошибок, например, rollback()
в блоке catch)
Ссылки
- Справочное руководство по Hibernate Core