2011-05-30 70 views
1

我不是Coldfusion orm的专家,我打电话给你的帮助,因为我拉我的头发!Coldfusion ORM:级联删除

我除了删除一个有两个关系的实体'行动'一对多,'文本'和'奖金'。

当我尝试删除只有文本但没有奖励的操作时,一切正常。 Hibernate删除Action记录和子文本。这是我想要的!

但当行动既有文本和奖金,我得到这个错误:

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

为什么Hibernate不删除之前的行动删除红利?就像它是为文本完成的?

感谢

行动实体:

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

} 

回答

1

不知何故Hiberate首先设置实体为Null(成为孤儿),然后删除孤儿。

因此..从属性action删除notnull="true"在Bonus.cfc中,你就是一切。

+0

的澄清好了THX。 – LarZuK 2011-05-30 19:01:54

+0

可以保持notnull =“true”并仍然享受自动抑制? 没有行动就不能存在奖励,我发现以前的行为很有用。 我知道我可以使用ORM事件来处理Action preDelete并手动删除所有的孩子,但是就像它是“自然的”,我认为它比在Hibernate中实现的要好。它是 ? – LarZuK 2011-05-30 19:08:53

+0

我不确定,但这就是Hibernate的“全部删除孤儿”的工作原理...... – Henry 2011-05-30 21:21:52

0

通过将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"; 
} 

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