2008-12-11 64 views
5

可以說我有兩張表 - 「孩子」和「父母」之間有多對一的關係。我需要的是刪除父記錄時刪除子條目。Hibernate:如何在刪除父項時使Hibernate從子表中刪除記錄如果子項與多對一的父項鍊接?

如果我通過在parent.hbm中創建一對多關聯並設置cascade =「all-delete-orphan」從父項鍊接子表,這不是問題。

問題是我不希望父對方有一對多的關係,所以我在孩子一方創建了多對一的關係。原因是子表非常大,我不想每次使用父母時提取數百條記錄。 所以我的配置是這樣的:

child.hbm:

<many-to-one name="parent" class="com.example.Parent" column="parentid"/> 

而parent.hbm有孩子沒有關聯。

現在的問題是:如何讓Hibernate從子表中刪除記錄時刪除父項,如果一個子項與多對一的父項鍊接?

謝謝。

+0

爲什麼不在你的家長中使用懶惰的一對多,而只是使用級聯選項?當你使用父母時,你不會加載孩子。 – gcores 2008-12-11 16:52:13

+2

這就是我的想法,但恐怕會給結構帶來混亂。我將需要添加「設置兒童」字段到父類,不應該在代碼中的任何地方使用,只用於休眠級聯刪除。你認爲這樣可以嗎? – serg 2008-12-11 16:56:19

回答

5

兩個選擇:

  • 添加一個一對多與級聯父刪除,但使用延遲加載減輕性能損失。

  • 使用Hibernate Interceptor(或AOP環境中的某個方面)來檢測父記錄刪除並刪除子項。

我個人傾向於第一種選擇,因爲它可以讓你的數據模型更密切地反映在您的數據的真正關係。

編輯:有第三種選擇,但它不愉快 - 使用數據庫觸發器,並刷新您的Hibernate緩存(或使用非緩存會話)。