2012-05-15 68 views
0

OnDelete級聯失敗,違反約束錯誤()休眠

<id name="idInstance" type="java.lang.Integer"> 
     <column name="ID_INSTANCE" /> 
     <generator class="native" /> 
    </id> 


    <property name="nom" type="string"> 
     <column name="NOM" length="50" not-null="true" /> 
    </property> 

      <property name="description" type="string"> 
     <column name="DESCRIPTION" length="300" not-null="true" /> 
    </property> 

    <set name="statistiques" cascade="all" lazy="false"> 
     <key column="ID_INSTANCE"></key> 
     <one-to-many class="Statistique" /> 
    </set> 
     </class> 

和類statistique的HBM文件是:

<class name="Statistique" table="STATISTIQUE"> 

    <id name="idStatistique" type="java.lang.Integer"> 
     <column name="ID_STATISTIQUE"/> 
     <generator class="native" /> 
    </id> 

    <property name="tempsReponse" type="java.lang.Double"> 
     <column name="TEMPS_REPONSE"/> 
    </property> 

    <property name="date" type="timestamp"> 
     <column name="DATE"/> 
    </property> 

</class> 

如果statistiques列表是空的,這似乎是工作的罰款。它無法與外國鍵衝突錯誤:

完整性約束違規FKD18D3C4EDC6F4BFB表:STATISTIQUE在語句[從INSTANCE_Monitor刪去(ID_INSTANCE)IN(選擇HT_INSTANCE_Monitor ID_INSTANCE)

回答

1

您可能在數據庫中有一個約束,它要求statistique中的每一行存在instance_monitor中的行。在可以刪除instance_monitor中的行之前,必須刪除statistique中的相關行。

條款cascade="all"並不意味着在數據庫級別級聯刪除。它只是強制休眠,爲子表生成顯式刪除語句(在你的情況下爲statistique)。問題是,刪除語句可能以與您的數據庫約束不兼容的順序到達。這也可能由於hibernate對數據庫語句的重新排序而發生。

你可以做什麼:要麼刪除數據庫約束(如果可能)或

  1. 刪除從statistique表中的行,這屬於instance_monitor「手動(」即有獨立的DELETE語句)
  2. 呼叫調用Session.flush()(防止對由Hibernate的聲明重新排序)
  3. 刪除instance_monitor
0

如果statistiques列表是空的,這似乎工作正常。它 因外鍵違規錯誤而失敗:

您似乎尚未在數據庫級別啓用級聯刪除。

+0

如何與Hibernate做IM東陽使用genereting的血清膽鹼酯酶數據庫maExport – aminedev

+0

請幫助我! – aminedev

+0

對不起有其他的事情。我試圖找到休眠級聯刪除配置,但我不完全知道如何做到這一點。大概這個鏈接可能會有所幫助-http://stackoverflow.com/questions/8209965/hibernate-ondelete-cascade-same-table – Kshitij