JPA, как удалить родителя без удаления детей? - PullRequest
4 голосов
/ 14 марта 2011

Я пытаюсь удалить родителя, но получаю нарушение внешнего ключа. Если я помещаю Cascade.ALL в родительский объект, он также удаляет дочерние элементы. И теперь это то, что я хочу.

У меня есть родительский класс: Docteur

//bi-directional many-to-one association to Patient
    @OneToMany(cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH}, orphanRemoval=false, mappedBy="docteur")
    private List patients;

и мои дети: пациент

Я положил это

    @ManyToOne()
    private Docteur docteur;

но в моем случае у пациента только один доктор.

В моем классе менеджера. Я пробую много вещей, которые не сработали

вот моя последняя версия

Clinique clinique = read(clinique_ID);
Docteur docteur = entityManager.createNamedQuery("getDocteur", Docteur.class).setParameter("clinique_ID", clinique_ID).setParameter("docteur_ID", docteur_ID).getSingleResult();

clinique.getDocteurs().remove(docteur);

entityManager.merge(clinique);

entityManager.persist(clinique);

Вот ошибка, которую я получаю:

Невозможно удалить или обновить родительскую строку: сбой ограничения внешнего ключа (jerabi_asteriskdb/Patient, CONSTRAINT FK340C82E5A10F077E FOREIGN KEY (docteur_DOCTEUR_ID) ССЫЛКИ Docteur (DOCTEUR_ID))

Ответы [ 2 ]

6 голосов
/ 14 марта 2011

Вы получаете нарушение внешнего ключа, потому что база данных проверяет, что каждый docteur_id в таблице пациента ссылается на действительный docteur.В этом весь смысл внешних ключей.База данных гарантирует, что вы не удалите документ, на который все еще ссылаются пациенты.

Чтобы удалить ваш доктор, вы должны убедиться, что никакая другая запись в базе данных не ссылается на этот docteur_id.Таким образом, вы должны обновить всех пациентов этого документа и установить для их docteur_id значение null:

Docteur docteur = entityManager.createNamedQuery("getDocteur", Docteur.class).setParameter("clinique_ID", clinique_ID).setParameter("docteur_ID", docteur_ID).getSingleResult();

for (Patient patient : docteur.getPatients()) {
    patient.setDocteur(null);
}
docteur.patients.clear();
clinique.getDocteurs().remove(docteur);

Кроме того, все присоединенные (постоянные) объекты автоматически обновляются Hibernate.Нет необходимости настаивать и объединять их.Читать http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#objectstate-overview.

0 голосов
/ 14 марта 2011

Чтобы база данных отношений могла обеспечить целостность данных, необходимо учитывать ссылки на зависимые строки в ссылочных таблицах. SQL 2003 определяет 5 различных ссылочных действий:

  1. CASCADE: зависимые строки удаляются
  2. ОГРАНИЧЕНИЕ: удаление завершается с ошибкой
  3. НЕТ ДЕЙСТВИЯ: как удаление, но позволяет запускать триггеры первыми, если они исправляют ошибку
  4. SET NULL: устанавливает равные нулю столбцы-ссылки (по крайней мере один столбец должен иметь значение NULL)
  5. SET DEFAULT: устанавливает для ссылочных столбцов значение по умолчанию (которое затем будет ссылаться на другую существующую строку в таблице, если хотя бы одно значение по умолчанию не равно NULL)
...