簡體   English   中英

Coldfusion ORM:級聯刪除

[英]Coldfusion ORM: delete in cascade

我不是 coldfusion orm 方面的專家,我打電話給你,因為我在扯頭發!

除了刪除具有 2 個一對多關系“文本”和“獎勵”的實體“操作”之外。

當我嘗試刪除只有文本但沒有獎勵的動作時,一切都很好。 Hibernate 刪除操作記錄和子文本。 這就是我想要的!

但是當動作同時有文本和獎勵時,我得到了這個錯誤:

Column 'bonus_actionId' cannot be null
Root cause :java.sql.BatchUpdateException: Column 'bonus_actionId' cannot be null

為什么 Hibernate 在刪除 Action 之前不刪除 Bonus? 就像文本一樣?

謝謝

動作實體:

component {
    property name="id"      column="action_id" type="numeric" fieldtype="id" generator="native";

    /* ... */

    property name="texts" type="array" 
             fieldtype="one-to-many" cfc="Text" fkcolumn="text_actionId" singularname="text"
             cascade="all-delete-orphan" lazy="true";

    /* ... */

    property name="bonus" type="array" 
             fieldtype="one-to-many" cfc="Bonus" fkcolumn="bonus_actionId" singularname="bonus" 
             cascade="all-delete-orphan" lazy="true";
}

文本實體:

component {
    property name="id"      column="text_id" type="numeric" fieldtype="id" generator="native";

    /* ... (properties without relationships */

    property name="action" fieldtype="many-to-one" fkcolumn="text_actionId" cfc="Action" notnull="false" lazy="true";
}

獎勵實體:

component  {
    property name="id"      column="bonus_id" type="numeric" fieldtype="id" generator="native";

    /* ... (properties WITH relationships */

    // Parent
    property name="action" fieldtype="many-to-one" fkcolumn="bonus_actionId" cfc="Action" notnull="true" lazy="true";

}

不知何故,Hiberate 會首先將實體設置為 Null(成為孤兒),然后刪除孤兒。

所以.. 從 Bonus.cfc 中的屬性action中刪除notnull="true"就可以了。

您可以通過將inverse="true"添加到關系的外鍵擁有方來保持您的notnull="true"並讓級聯正常工作。

在您的情況下,這將在Action實體上:

component {

    property name="id"
             column="action_id"
             type="numeric"
             fieldtype="id"
             generator="native";

    /* ... */

    property name="texts"
             type="array" 
             fieldtype="one-to-many"
             cfc="Text"
             fkcolumn="text_actionId"
             singularname="text"
             cascade="all-delete-orphan"
             inverse="true"
             lazy="true";

    /* ... */

    property name="bonus"
             type="array" 
             fieldtype="one-to-many"
             cfc="Bonus"
             fkcolumn="bonus_actionId"
             singularname="bonus" 
             cascade="all-delete-orphan"
             inverse="true"
             lazy="true";
}

這是一篇關於 Hibernate 中的inverse如何工作的文章。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM