JPA CascadeType.ALL не удаляет дочерние записи - PullRequest
1 голос
/ 24 мая 2011

Рассмотрим этот вариант использования.

class Category {
   @OneToMany(cascade=CascadeType.ALL)
   List<Application> applications = new ArrayList<Application>();
}

class Application {
   @ManyToOne
   Category category;       
}

Я понимаю, что в этом случае, когда категория будет удалена, приложение также будет удалено.Но кто позаботится о присоединении к столу?Таблица Category_Application, сгенерированная для отношения.

Ответы [ 2 ]

3 голосов
/ 24 мая 2011

Строки объединяющей таблицы всегда следует удалять независимо от cascade.

Для двунаправленной ManyToMany стороны-владельца (не mappedBy) строки будут удалены.

Поскольку у вас есть ManyToOne назад, похоже, вы должны использовать mappedBy, а не таблицу соединений.

Проблема в том, что они не удаляются, или вы получаете сообщение об ошибке ограничения перед их удалением? Также убедитесь, что ваша коллекция не пуста, когда вы звоните remove(). Попробуйте также удалить все из коллекции перед вызовом remove.

2 голосов
/ 13 января 2012

Похоже, это та же проблема, что и:

JPA CascadeType.ALL не удаляет сирот

В основном, когда у вас есть @OneToMany, JPAпо умолчанию предполагается, что дочерний объект имеет независимый жизненный цикл и может быть связан с несколькими родителями.Удаление родителя не обязательно удаляет ребенка.Указание orphanRemoval=true в JPA 2.0 (или Eclipselink @PrivateOwned или Hibernate CascadeType.DELETE_ORPHAN) говорит JPA об удалении дочерних записей при удалении родителя.

Если вы всегда хотите привязать жизненный цикл дочерней записи к егоparent, вы также можете рассмотреть @ElementCollection вместо @OneToMany, что даст аналогичное поведение, но не позволит вам сохранить дочерние объекты независимо от родителя.(то есть, дочерние объекты @ElementCollection не являются @Entities.)

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