2015-10-20 3 views
1

Я использую 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)) 

Есть ли способ контролировать порядок, что удаляется, когда? Я бы очень хотел выполнить эти каскадные удаления ПОСЛЕ основного удаления, чтобы условные выражения не были бесполезны. Я также действительно не хочу выводить эту логику из уровня БД.

Спасибо!

ответ

1

В этом случае лучше сначала выбрать идентификатор объекта, который вы хотите удалить, а затем выпустить второй запрос JPQL для удаления объекта с этим конкретным идентификатором.

Поведение, которое вы наблюдаете, относится к вашему провайдеру JPA, и я думаю, что это мало что нужно сделать. Или решение слишком сложно и не переносится, что это не стоит.

Обратите внимание, что заказ не работает. Если вы сначала удалили Entity перед группами, вы потеряли ссылки на связанные группы. В большинстве случаев удаление объекта может даже завершиться неудачей из-за ограничений внешнего ключа.

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