Невозможно каскадно удалить участника @OneToOne - PullRequest
5 голосов
/ 11 ноября 2010
@Entity public class Organization {

    @OneToOne(fetch = FetchType.EAGER)
    @OnDelete(action = OnDeleteAction.CASCADE)
    @Cascade(value = DELETE_ORPHAN)
    private Days days;

}

У меня есть следующее определение сущности, и он генерирует SQL для каскадного удаления записи @OneToOne, когда родительский объект удаляется.Но это не удаление записи "days" при удалении организации.

Это происходит с базами данных h2, mysql, в чем здесь может быть проблема.

Ответы [ 2 ]

6 голосов
/ 11 ноября 2010

Ну, я думаю, вы должны добавить

@Cascade(value = {DELETE, DELETE_ORPHAN})

Обратите внимание, что в JPA 2.0 вам не нужно использовать hibernate-sepcific @Cascade аннотация - @*ToMany имеет возможность удалять сирот.

Обновление: при использовании запросов каскады не обрабатываются. Вы должны обращаться с ними вручную. Это ожидаемое и задокументированное поведение.

5 голосов
/ 11 ноября 2010

Мой запрос выглядит так: «Удалить из организации, где some_key_id =?»(я не удаляю это на основе идентификатора первичного ключа)

Массовое удаление (вы должны упомянуть об этом в своем вопросе) ни к чему не приводит.Цитирование спецификации JPA 1.0:

4.10 Операции массового обновления и удаления

...

Операция удаления применяется только к объектам указанного класса и его подклассам, Это не относится к связанным сущностям .

Это очень раздражающее ограничение, и есть много RFE для улучшения вещей ( HHH-695 , HHH-1917 , HHH-3337 , HHH-5529 и т. Д.).

На данный момент возможные решения включают:

  1. очистите дочернюю таблицу самостоятельно
  2. используйте каскадные внешние ключи в схеме.

Теперь странная часть ... Мое понимание @OnDelete(action = OnDeleteAction.CASCADE) состоит в том, что эта аннотацияпредполагается, что он используется для обеспечения того, чтобы внешний ключ создавался с соответствующим условием ON DELETE CASCADE (решение № 2).Другими словами, я ожидаю, что все будет работать.

Сгенерировал ли Hibernate таблицу Organization?Можете ли вы проверить DDL?Вы видите ожидаемое ON DELETE CASCADE?Если нет, добавьте его.

...