Мне нужно удалить объект с его дочерними объектами. Вот мой код:Удалить каскад с 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 решения, которые не соответствуют мне:
- Вручную удалять сирот одним запросом на сущность.
- Анимация атрибутов сущности.
Я бы предпочел использовать простой параметр где-то, но не могу найти, существует ли он.
Любая идея?
ли вы использовать еще несколько выражений в вашем где заявлении, или почему дон Вы используете 'EntityManager.remove()'? И с _annotate атрибуты сущности_ вы имеете в виду 'cascade = ...'? –
@TobiasLiefke Да, я мог бы использовать 'EntityManager.remove()', и да, я имею в виду 'cascade = ...'. Чтобы код работал, я буду использовать аннотацию, но я был бы признателен, если бы существовал более чистый метод. –
Я думаю, что 'cascade = CascadeType.REMOVE' (или' CascadeType.ALL') является лучшим решением, так как описывает отношение, в котором оно принадлежит: в модели. В противном случае легко забыть удалить сирот, когда вы (или один из ваших соавторов) удалите «MyEntity». –