2011-03-13 139 views
2

我試圖刪除父母,但我不斷收到一個外鍵違規。如果我將Cascade.ALL放在父級中,它也會刪除這些孩子。現在它是我想要的。JPA如何刪除沒有刪除孩子的父母?

我有我的父類:法學博士

 
//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; 

但對我來說,患者choul只有一個法學博士。

在我的經理類。我嘗試很多東西,沒有工作

我在這裏的最新版本

 
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,約束FK340C82E5A10F077E外鍵(docteur_DOCTEUR_ID)參考文獻DocteurDOCTEUR_ID))

回答

0

這樣一個關係數據庫可以執行數據的完整性,以依賴R參數必須考慮引用表中的行爲。 SQL 2003指定5個不同的參照動作:

  1. CASCADE:從屬行被刪除
  2. RESTRICT:刪除因錯誤而失敗
  3. 沒有施加作用:像刪除,但允許觸發器先運行,如果他們解決錯誤
  4. SET NULL:將引用列設置爲空(至少一列必須爲空)
  5. SET DEFAULT:將引用列設置爲其默認值(然後引用表中的另一行,除非至少有一個默認爲NULL)
+1

它是如何在JPA 2.0中這樣做的問題。簡單的SQL會很容易。 – 2011-03-13 22:21:25

5

由於數據庫檢查患者表中的每個docteur_id都引用了有效的docteur,因此會出現外鍵衝突。這是外鍵的全部重點。數據庫確保您不會刪除仍由患者引用的docteur。

爲了刪除您的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

對不起,我提到了Hibernate,也許你正在使用另一個JPA實現。但答案仍然存在。 – 2011-03-13 22:25:55

+0

如果你必須明確地將Docteur對象設置爲null,那麼這不會破壞使用JPA執行cassade刪除的目的嗎?如果是這種情況,那麼我認爲編寫我自己的刪除SQL是更好,更有前途的。 – 2015-03-13 00:23:21

+0

@ Mr.PortStJoe刪除docteur時級聯刪除會刪除docteur的患者。 OP想要刪除docteur,但將病人留在數據庫中,無需docteur。這裏沒有層疊。 – 2015-03-13 07:13:41

相關問題