【问题标题】:OnDelete cascade fails with constraint violation error () HibernateOnDelete 级联因违反约束错误而失败 () Hibernate
【发布时间】:2012-05-15 10:17:37
【问题描述】:

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

如果统计列表为空,这似乎工作正常。它因外键违规错误而失败:

完整性约束违反 FKD18D3C4EDC6F4BFB 表:STATISTIQUE in statement [delete from INSTANCE_Monitor where (ID_INSTANCE) IN (select ID_INSTANCE from HT_INSTANCE_Monitor)]

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    您可能在数据库中有一个约束,它要求 statistique 中的每一行都存在 instance_monitor 中的行。在您可以删除 instance_monitor 中的行之前,您必须先删除 statistique 中的相关行。

    子句cascade="all" 并不意味着数据库级别的级联删除。它只是强制休眠为子表生成显式删除语句(在您的情况下为statistique)。问题是,删除语句可能以与您的数据库约束不兼容的顺序到达。这也可能由于 hibernate 对数据库语句的重新排序而发生。

    您可以做什么:删除数据库约束(如果可能)或

    1. 手动删除统计表中属于 instance_monitor 的行(“即使用单独的删除语句)
    2. 调用 session.flush()(防止语句被休眠重新排序)
    3. 删除 instance_monitor

    【讨论】:

      【解决方案2】:

      如果统计列表为空,这似乎工作正常。它 因外键违规错误而失败:

      您似乎没有在数据库级别启用级联删除。

      【讨论】:

      • 如何使用 hibernate 来实现,因为我正在使用 SchemaExport 生成数据库
      • 抱歉正忙于其他事情。我试图找到休眠的级联删除配置,但我不完全知道如何去做。可能这个链接可能会有所帮助 -stackoverflow.com/questions/8209965/…
      • 我没有找到解决方案,我使用 cascade="all" 这意味着 = 保存更新和删除,但我不知道为什么它不起作用!!
      • 只检查生成的数据库表的ddl..它有新的级联约束吗?
      • 我检查了,他不包含级联约束!我正在使用休眠 3.2.6 和 Mysql Innodb
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-09
      • 2012-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多