2014-01-06 124 views
0

我正在使用Hibernate的JPA實現。我有一個不同類型的用戶(私人|公共等..)的用戶表,user_type列指定用戶的類型。Hibernate JPA級聯刪除與DiscriminatorColumn

我有一個User類,它是一個表示用戶表的實體。我在我的用戶類添加

@DiscriminatorColumn(name="user_type", discriminatorType=DiscriminatorType.STRING) 

和創建的2類,PrivateUser和PublicUser各自延伸用戶類具有對應@DiscriminatorValue它們。

我還有PrivateCompany和PublicCompany表,它們在用戶表中分別使用一個名爲company_id的列具有一對多關係PrivateUser實體和PublicUser實體。我也有兩個OneToMany關係級聯刪除。

現在,如果我有一個PrivateCompany ID爲10,PublicCompany ID爲10,並且userCompany和PublicCompany的用戶表中的用戶條目如下所示。

user_id | company_id | user_type 
100  10   private 
101  10   public 

如果我刪除PrivateCompany,我結束了刪除用戶101與100一起,因爲在COMPANY_ID和一對多的關係並不儘管它提到作爲DiscriminatorColumn考慮USER_TYPE列。我正在尋找一種方法來提供級聯刪除功能,該功能在刪除子級時處理DiscriminatorColumn。我試圖創建具有多列的JoinColumns,但我可以創建與列名稱但不是列值(這是我的情況)的關係。

如果我的解釋不清楚,請讓我知道。

在此先感謝

回答

0

我想通了,對PrivateUser類添加註釋@SQLDelete像下面

@SQLDelete(sql="delete user WHERE private_company_id = ? and rel_type = 'private'") 
public class PrivateUser extends User { 

} 

這樣我可以添加級聯上PrivateCompany的一對多關係和PrivateUser,但是當梯級踢,它執行刪除在SQLDelete註釋中提到的查詢可以讓你控制。如果您想將記錄標記爲不活動而不是刪除,也可以使用此方法。

參考:Override default remove()/DELETE in JPA/Hibernate

0

據我瞭解,你Company實體(PublicCompanyPrivateCompany)被映射到兩個不同的表。如果是這樣,那麼我也假設每個公司都有一個User的列表,而不是PrivateUserPublicUser。 如果一切正常,那麼你必須:

  1. 要麼刪除手動級聯和處理。
  2. 更改公司實體中列表/集合的類型:而不是Collection<User>您需要PrivateCompany中的Collection<PrivateUser>和PublicCompany中的Collection<PublicUser>

另外,爲什麼不簡單地合併PrivateUser & PublicUser在一個單一的實體+公司實體相同,並區分你的邏輯類型?

+0

安德烈,感謝您的答覆,我有PrivateUser和PublicUser的集合。我可以手動處理它,但我正在尋找一個級聯解決方案,將user_type考慮在內,如果刪除PrivateCompany,並且反之亦然,則只刪除privateUsers。我只想確認在實施手動解決方案之前,Hibernate/JPA無法做到這一點 –