我在WebLogic 10.0.x上使用OpenJPA(JPA 1.0)和Oracle。我已經定義了OneToMany關係如下:OpenJPA CascadeType.DELETE導致外鍵違規
@Entity
public class Compound implements Serializable {
...
@OneToMany(mappedBy="compound", fetch=FetchType.LAZY, cascade=CascadeType.ALL)
private List<Submission> submissions = new ArrayList<Submission>();
...
}
@Entity
public class Submission implements Serializable {
...
@ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.REFRESH)
@JoinColumn(name="compoundId")
private Compound compound;
...
}
當我刪除一個化合物實體時,所有的子提交實體也應該被刪除。這個工程作爲一般規則,但我對這些表的外鍵約束設置:
ALTER TABLE SUBMISSION
ADD CONSTRAINT FK_SUBMISSION_COMPOUND
FOREIGN KEY (COMPOUNDID)
REFERENCES COMPOUND(COMPOUNDID);
現在,當我試圖刪除我遇到以下異常複合實體:
ORA-02292: integrity constraint (HELC.FK_SUBMISSION_COMPOUND) violated - child record found {prepstmnt 3740 DELETE FROM Compound WHERE compoundId = ? [params=(long) 10384]} [code=2292, state=23000]"
的上面的異常意味着Open JPA試圖在將刪除級聯到子實體之前刪除父級。我已經閱讀了幾篇關於這個例外的文章,可以追溯到2006年。然而,最近的文章表明這個bug已經修復了嗎?
http://mail-archives.apache.org/mod_mbox/openjpa-dev/200609.mbox/%[email protected]%3E
https://issues.apache.org/jira/browse/OPENJPA-235
任何人都可以說明爲什麼這不是工作,我能做些什麼呢?我不喜歡手動刪除子實體,特別是因爲這是我架構中較不復雜的關係之一,無論我使用什麼解決方案,我都需要在其他地方應用。
感謝 周杰倫
你在OpenJPA有多少經驗?提交中的CascadeType有可能是錯誤的嗎? –
OpenJPA?不多。我不知道在提交類中是否需要級聯定義?這是一個獨立的實體,所以如果父(複合)實體被刪除,它應該被刪除,但刪除提交不應該刪除父。就我所知,我的代碼是正確的。 –
有一件事 - 如上所述,這是Weblogic 10.0.x.我懷疑我們使用的OpenJPA/Kodo的捆綁版本,這可能是相當老... –