Использование collection.clear() в @ManyToMany в Spring-> JPA-> Hibernate приводит к N удалению инструкций

#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)