Я использую barebone JPA с Hibernate как провайдера - я не использую никаких функций, связанных с гибернацией. У меня есть объект с полем @ManyToMany
, который сопоставляется с другой таблицей MtM с двумя столбцами, Groups
и CASCADE DELETE
указан для полей этой таблицы MtM.Есть ли способ управлять заказом каскада JPA?
Удаление каскадов все работает нормально. Проблема возникает, когда мне нужно удалить одну из моего лица из базы данных:
String jpql = "DELETE FROM Entity e WHERE e.id = :id AND :g MEMBER OF e.groups"
Query tq = em.createQuery(jpql);
tq.setParameter("id", 42);
tq.setParameter("g", myGroup);
long rows = tq.executeUpdate();
if (rows == 0) throw new Exception();
второе условие выше запроса всегда будет ложным, по-видимому, из-за MTM entity_group
записи субъекта удаляется перед удалением субъекта имеет место. Если я включить ведение журнала запросов, я вижу что-то вроде:
delete from **entity_group** where (entity_id) in (select id from entity where id=?)
delete from entity where id=? and (? in (select groups1_.group_id from **entity_group** groups1_ where entity.id=groups1_.entity_id))
Есть ли способ контролировать порядок, что удаляется, когда? Я бы очень хотел выполнить эти каскадные удаления ПОСЛЕ основного удаления, чтобы условные выражения не были бесполезны. Я также действительно не хочу выводить эту логику из уровня БД.
Спасибо!