2010-09-19 66 views
3

我有一個用戶,並在一個一對多的關係,一組機構的子記錄:如何刪除而不是設置外鍵爲空

User.hbm.xml:

<set name="authorities" table="authorities" cascade="all-delete-orphan"> 
    <key column="user_id" /> 
    <one-to-many class="com.ebisent.domain.Authority" /> 
</set> 

當我刪除一個用戶時,我也想刪除權限,但是發生的情況是子表的外鍵(authorities.user_id)被設置爲null。然後,我得到以下錯誤和用戶刪除回滾:

org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 

的authorities.user_id更新爲null是不是然而回滾。

當我刪除父用戶時,如何刪除權限?

編輯: 我得到這個工作,明確刪除權威,呼籲refresh()對用戶,然後刪除用戶,但我想知道「正確」的方式來做到這一點。

回答

1

這很奇怪,級聯all-delete-orphan應該將父母操作從delete級聯到孩子。或

Parent p = (Parent) session.load(Parent.class, pid); 
session.delete(p); 
session.flush(); 

你得到了不同的結果,使用all,delete-orphan時更加簡單delete(也不應該):所以下面應該足以讓刪除的孩子。聯想是雙向的嗎?如果是的話,你可以展示另一面和相應的映射嗎?

該協會只是從父母到孩子,我得到了所有相同的結果,刪除孤兒,和刪除,但...我沒有session.flush(),似乎解決這個問題。

顯式刷新可能有幫助。但它不應該是必要的。我認爲是定義外鍵非可空,將有助於獲得正確的行爲:

<set name="authorities" table="authorities" cascade="all-delete-orphan"> 
    <key column="user_id" not-null="true"/> 
    <one-to-many class="com.ebisent.domain.Authority" /> 
</set> 

雖然沒有測試。

+0

您是否需要關係上的inverse =「true」來讓子記錄實際刪除? – nos 2010-09-19 17:04:15

+0

嗨,帕斯卡爾,號碼。該關聯只是從父母到孩子,並且我得到與所有,delete-orphan和delete相同的結果,但是......我沒有session.flush(),並且似乎解決了這個問題。謝謝! – outis 2010-09-19 17:41:20

+0

@nos IMO,'inverse = true'對於單向關聯不應該是必需的。 – 2010-09-19 18:00:44