Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Ограничение внешнего ключа JPA 2.0

Автор вопроса: MukiОтветов: 2

У меня простое отношение OneToOne:
Данные ‹-> TherapyResult

Я хотел бы выразить следующие ограничения с помощью JPA.

  1. Если объект Data удаляется, связанный с ним TherapyResult также должен быть удален.
  2. Если объект TherapyResult удаляется, связанный с ним объект Data должен оставаться в базе данных.

Первое ограничение очень просто с JPA, так как я могу добавить CascadingType.REMOVE

@OneToOne(cascade = { CascadeType.REMOVE, CascadeType.REFRESH })
private TherapyResult therapyResult;

Для второго ограничения я хотел бы добавить что-то вроде

@JoinColumn(columnDefinition = "DATA_ID BIGINT CONSTRAINT THERAPYRESULTDTAID FOREIGN KEY (DATA_ID) REFERENCES DATA (ID) ON DELETE SET NULL")

Однако это не работает. В OpenJPA похоже есть что-то похожее, но я хочу использовать JPA 2.0 и EclipseLink. Внешний ключ OpenJPA а>.

Другим решением может быть использование @PreRemove описано здесь , который работает, но выглядит для меня немного "не передовой практикой". Однако только ощущение.

Моя установка: Eclipse 3.7.1 EclipseLink 2.3 Apache Derby 10.8.3 и/или HSQLDB

любая помощь приветствуется, Муки

constraintsjpaforeign-key-relationship

Ответы

Ответ 1 · рейтинг 2 · DataNucleus

Вы не можете использовать чистый JPA для указания внешних ключей... эта спецификация не включает эту возможность. JDO - единственный стандарт с возможностью определения FK. Вы должны использовать особенности реализации или просто определить схему самостоятельно и позволить реализации JPA работать на ней.

Ответ 2 · рейтинг 2 · JB Nizet

Если у вас есть внешний ключ от данных к TherapyResult, и данные являются владельцем ассоциации, то

  • удаление данных приведет к автоматическому удалению TherapyResult, если для каскада установлено значение REMOVE.
  • вам просто нужно установить для поля therapyResult значение null, а затем удалить TherapyResult, чтобы получить то, что вам нужно. Другой вариант - установить для orphanRemoval значение true, и в этом случае достаточно установить для поля therapyResult значение null, чтобы удалить его из базы данных.

Если у вас есть внешний ключ от TherapyResult к Data, а TherapyResult является владельцем ассоциации, то

  • удаление данных приведет к автоматическому удалению TherapyResult, если каскад установлен на REMOVE в поле Data.therapyResult.
  • удаление TherapyResult оставит данные в базе данных при условии, что каскад не установлен на REMOVE в поле TherapyResult.data

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы