#hibernate #spring #jpa
#переход в спящий режим #spring #jpa
Вопрос:
При использовании c.clear(), где c относится к типу Collection, представляющему отношения владения @ManyToMany, Spring-> JPA-> Hibernate создает одну инструкцию удаления для каждой записи в коллекции, такую как:
Hibernate: delete from printer_feature where printers_id=? and features_id=?
Hibernate: delete from printer_feature where printers_id=? and features_id=?
Hibernate: delete from printer_feature where printers_id=? and features_id=?
Hibernate: delete from printer_feature where printers_id=? and features_id=?
Hibernate: delete from printer_feature where printers_id=? and features_id=?
Я читал, что в Hibernate есть что-то, называемое пакетной обработкой, но не уверен, может ли это помочь или может быть как-то «намекнуто» в аннотациях JPA. Я пытаюсь уменьшить количество инструкций удаления здесь.
Как это можно оптимизировать для:
1) delete from printer_feature where printer_id = ?
, в конце концов, я делаю clear()
над коллекцией, поэтому она должна все очистить, верно?
2) delete from printer_feature where printer_id = ? and feature_id in (?, ?, ?, ....)
в качестве компромисса это может быть изменено на одно удаление в этом формате?
Спасибо. -AP_
Ответ №1:
Я не знаю о такой опции. Проблема с пакетным удалением здесь заключается в том, что удаляемые объекты также могут иметь ассоциации.
Для этого вы можете использовать запрос HQL, но он будет игнорировать любые каскады ассоциаций (запрос удаления hql практически такой же, как эквивалент sql)