2015-06-22 2 views
0

Мне нужно удалить объект с его дочерними объектами. Вот мой код:Удалить каскад с JPA DSL

public void deleteCascade(Integer entityId) { 
    CriteriaBuilder cb = em.getCriteriaBuilder(); 
    CriteriaDelete<MyEntity> criteriaDelete = cb.createCriteriaDelete(MyEntity.class); 
    Root<MyEntity> myEntity = criteriaDelete.from(MyEntity.class); 
    criteriaDelete.where(
      cb.equal(MyEntity.get(MyEntity_.id), entityId) 
); 
    em.createQuery(criteriaDelete).executeUpdate(); 
} 

Это явно не работает из-за сирот. Я знаю 2 решения, которые не соответствуют мне:

  • Вручную удалять сирот одним запросом на сущность.
  • Анимация атрибутов сущности.

Я бы предпочел использовать простой параметр где-то, но не могу найти, существует ли он.

Любая идея?

+0

ли вы использовать еще несколько выражений в вашем где заявлении, или почему дон Вы используете 'EntityManager.remove()'? И с _annotate атрибуты сущности_ вы имеете в виду 'cascade = ...'? –

+0

@TobiasLiefke Да, я мог бы использовать 'EntityManager.remove()', и да, я имею в виду 'cascade = ...'. Чтобы код работал, я буду использовать аннотацию, но я был бы признателен, если бы существовал более чистый метод. –

+0

Я думаю, что 'cascade = CascadeType.REMOVE' (или' CascadeType.ALL') является лучшим решением, так как описывает отношение, в котором оно принадлежит: в модели. В противном случае легко забыть удалить сирот, когда вы (или один из ваших соавторов) удалите «MyEntity». –

ответ

0
  • Решения 1. С помощью двух запросов:

    1. Удалить все будущие сирота (т.е. BULK DELETE, а не запрос на субъект).
    2. Удалить само устройство.
  • Решение 2: Я не уверен, что это не то же самое, как ваши вторые идеи: Марка отношения с orphanRemoval=true

+0

'orphanRemoval' is _not_ работает для данного примера:' orphanRemoval' означает удалить дочерний элемент из базы данных, когда его ссылка удалена, а 'cascade = CascadeType.REMOVE' означает ее удаление, если родительский объект удален. –

+0

'orpahnRemoval' [означает] (http://stackoverflow.com/questions/27621433/jpa-cascadetype-all-doesnt-delete-parent-and-child-rows), чтобы удалить родителя с его дочерними элементами. Я думаю, он тоже должен работать. Как насчет первого решения? –

+0

Я думаю [этот вопрос] (http://stackoverflow.com/questions/4329577/jpa-2-0-orphanremoval-true-vs-on-delete-cascade) было бы лучше описать разницу между обоими аннотациями. Но вы правы, это сработает - за исключением того, что он делает больше, чем нужно. У меня нет ничего против вашего первого решения - хотя я думаю, что аннотация - лучшее решение (см. Мой комментарий к оператору). –

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