gpt4 book ai didi

java - OnDelete 级联失败并出现约束冲突错误 () Hibernate

转载 作者:行者123 更新时间:2023-12-01 15:22:58 28 4
gpt4 key购买 nike

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

统计类的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>

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

Integrity constraint violation FKD18D3C4EDC6F4BFB table: STATISTIQUE in statement [delete from INSTANCE_Monitor where (ID_INSTANCE) IN (select ID_INSTANCE from HT_INSTANCE_Monitor)]

最佳答案

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

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

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

  1. “手动”从 statistique 表中删除属于 instance_monitor 的行(“即使用单独的删除语句)
  2. 调用 session.flush() (防止 hibernate 重新排序语句)
  3. 删除instance_monitor

关于java - OnDelete 级联失败并出现约束冲突错误 () Hibernate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10598617/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com