2011-05-30 111 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.