Удаление родителя и всех детей - PullRequest
3 голосов
/ 30 июня 2010

У меня проблема с удалением родительского объекта из базы данных.Код выглядит следующим образом:

public class Parent implements Serializable {
  @Id
  @GeneratedValue(strategy = GenerationType.TABLE)
  private Long id;  

  @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
  @JoinColumn(name="parentId")
  private Set<Child> children = new HashSet<Child>();
}

public class Child implements Serializable {
  @Id
  @GeneratedValue(strategy = GenerationType.TABLE)
  private Long id;  

  private String name;
}


Query q = em.createQuery("delete from Parent");
q.executeUpdate();

Но я получаю «ОШИБКА: обновление или удаление в таблице« parent »нарушает ограничение внешнего ключа« fk2f04da924aeb47d8 »в таблице« child »».Разве нельзя каскадно удалить всех детей?Как вы должны очистить таблицы в противном случае?

1 Ответ

1 голос
/ 30 июня 2010

Операция массового удаления не является каскадной.Из спецификации JPA 1.0:

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

(...)

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

(...)

Поэтому, если вы хотите использовать массовое удаление, вам придется обрабатывать отношения "вручную" (т. е. сначала удалить связанные сущности).

Другой вариант заключался бы в зацикливании родительских сущностей и вызове em.remove() (и сработал бы каскад).

Выбор того или иного параметра будет зависеть от количества удаляемых объектов и ожидаемых результатов.

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