2012-03-13 4 views
1

У меня есть простой OneToOne отношения:
данных < ->TherapyResultJPA 2.0 Ограничение внешнего ключа

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

  1. Если данных объект получает удаляется соответствующий TherapyResult следует удалить, слишком
  2. Если TherapyResult объект получает удален связанный данных объект должен оставаться в БД

Первое ограничение очень просто с 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 ForeignKey.

Другое решение будет использовать @PreRemovedescribed here, который работает, но выглядит немного «не-лучшими» для меня. Однако просто чувство.

Моя установка: Затмение 3.7.1 EclipseLink 2,3 Apache Derby 10.8.3 и/или HSQLDB

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

ответ

2

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

+0

Это не похоже, вступает в силу с JPA 2.1: https: //docs.jboss. org/hibernate/jpa/2.1/api/javax/persistence/ForeignKey.html – Piohen

2

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

  • удаления данных удалит TherapyResult автоматически, если каскад установлен УДАЛИТЬ
  • вы просто необходимо установить для поля therapyResult значение null, а затем удалить TherapyResult, чтобы иметь то, что вам нужно. Другой вариантом является установка orphanRemoval истины, в этом случае установка therapyResult поля обнулить достаточно, чтобы удалить его из базы данных

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

  • удаления данных будет автоматически удалять TherapyResult, если каскад установлен в REMOVE на Data.therapyResult поле.
  • удаления TherapyResult оставит данные в БД при условии, что каскад не установлен УДАЛИТЬ на TherapyResult.data поле
+0

Приятно, но что происходит, если отношения - это много TherapyResult для одного Data, а foreignkey - от TherapyResult к данным? Как это возможно: удаление TherapyResult не удаляет данные; удаление данных удаляет все связанные с этим результаты терапии? –

+0

Удаление терапии просто сделает это. Удаление данных приведет к удалению результатов терапии, если ассоциация от данных к результату терапии имеет каскад REMOVE. Это то, что каскад в ассоциации означает: при выполнении X на сущности также делать X на ассоциированных объектах. –

Смежные вопросы