2012-05-15 46 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