2012-03-13 80 views
1

我有簡單的OneToOne關係:
數據 < - >TherapyResultJPA 2.0外鍵約束

我想表達以下約束 與JPA。

  1. 如果如果TherapyResult實體被移除的數據實體獲取刪除相關TherapyResult應該被刪除,太
  2. 相關數據實體應保持在DB

第一個約束與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,它工作但對我來說看起來有點「無最佳實踐」。然而,只是一種感覺。

我的設置是: 的Eclipse 3.7.1 的EclipseLink 2.3 的Apache Derby 10.8.3和/或HSQLDB

任何幫助表示讚賞, 繆奇

回答

2

不能使用純JPA指定外鍵...該規範不包括該能力。 JDO是唯一能夠定義FK的標準。您必須使用實現細節,或者只是自己定義模式,並讓JPA impl在其上運行。

+0

這似乎並不有效,因爲JPA 2.1:HTTPS://docs.jboss。 org/hibernate/jpa/2.1/api/javax/persistence/ForeignKey.html – Piohen 2014-10-08 10:37:47

2

如果從數據到TherapyResult外鍵,以及數據是該協會的所有者,那麼

  • 刪除的數據將刪除TherapyResult如果自動級聯集去除
  • 只是
  • 你需要將therapyResult字段設置爲null,然後刪除TherapyResult以獲得所需內容。另一種選擇是orphanRemoval設置爲true,在這種情況下設置therapyResult字段設置爲null是足夠的。如果你有一個從TherapyResult到的數據外鍵,和TherapyResult是的主人,從數據庫

刪除關聯,然後

  • 如果在Data.therapyResult字段中級聯設置爲REMOVE,則刪除數據將自動刪除TherapyResult。
  • 去除TherapyResult將留在DB提供的數據級聯未設置爲消除對TherapyResult.data
+0

不錯,但是如果關係是Many TherapyResult to One Data,並且ForeignKey是從TherapyResult轉換爲Data,會發生什麼?怎麼可能:去除TherapyResult不會刪除數據;刪除數據會刪除所有相關的TherapyResults? – 2013-09-23 14:56:06

+0

刪除治療只會做到這一點。如果數據與治療結果的關聯具有REMOVE級聯,則刪除數據將刪除治療結果。這就是協會級聯的意思:在實體上執行X時,還要在關聯實體上執行X. – 2013-09-23 15:00:55