Coldfusion ORM:级联删除

时间:2011-05-30 16:08:06

标签: hibernate orm coldfusion

我不是冷血的专家,我打电话给你,因为我拉着头发!

我除了删除一对多关系的实体'Action','Texts'和'Bonus'。

当我尝试删除仅包含文本但没有奖励的动作时,一切都很好。 Hibernate删除Action记录和子文本。这就是我想要的!

但是当Action同时拥有文本和奖金时,我收到了这个错误:

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

}

2 个答案:

答案 0 :(得分:1)

Hibernate会先将实体设置为Null(成为孤儿),然后删除孤儿。

所以..从Bonus.cfc中的属性notnull="true"中删除action,您就已经完成了设置。

答案 1 :(得分:0)

通过将notnull="true"添加到关系的外键拥有方,您可以保留inverse="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";
}

Here's a write-up on how inverse works in Hibernate.