2009-11-02 74 views
2

我有一張憑證 - POJO映射到兩個表。第一個映射指定實體名稱「voucherA」並將POJO映射到TableA。第二個映射使用「voucherB」作爲實體名稱並將POJO映射到TableB。如何將多對多關聯映射到映射到兩個不同表的類?

現在我也有一個客戶POJO映射到TableC。此POJO參考列表中的憑證。

<list name="vouchers" table="TableC_vouchers"> 
    <key column="pid"/> 
    <list-index column="position" base="0"/> 

    <!-- how to do that right --> 
    <many-to-many column="voucher_id" entity-name="voucherB"/> 
</list> 

如何正確映射許多-to-many關聯的從客戶憑證列表,這樣,如果客戶POJO持久保存,該券的實體被保存到表B,如果不存在,他們在那裏,而不是的表A?這可以做到嗎?如果不是,解決方法是什麼樣的,客戶使用的代金券會持續到tableB? (表A只包含可用的優惠券,而不是使用的優惠券)

+0

只是爲了澄清,你是否堅持使用每種優惠券的表?將兩種類型的代金券存放在單一表格中是不可接受的? – Lyudmil 2009-11-02 16:09:50

+0

第二張表只包含已使用的憑證。同樣在我的情況下,不同的用戶可以多次使用一張優惠券。在我的問題中,TableA可以理解爲「憑證仍然可用」和TableB「已使用的憑證」。它也可能發生TableA的代金券被刪除。我堅持如何創建多對多的關聯。 – Chris 2009-11-02 16:15:38

+0

我明白了。如果您在表格中爲每個憑證存儲了一個標誌,如果使用憑證則爲真,如果不是,則爲假。我想這樣你仍然可以隨意刪除未使用的,但是你可以在同一個表中使用所有憑證,這使得多對多的微不足道。 – Lyudmil 2009-11-02 16:20:00

回答

3

你的核心模型看起來不對。您的Voucher實體可能具有許多屬性 - 它們在被Customer使用後是否會發生變化?我不信。然而,你在你的A和B表中複製它們,這意味着你的模式沒有被標準化。

「可用」優惠券和「已用」優惠券不是(或不應該是)同一個實體。相反,我會建議您爲UsedVoucher創建一個新實體,該實體將多對一地鏈接到Voucher,並且多對一鏈接到Customer,並且只包含Voucher(如果有)的「已更改」屬性。所以,

Voucher(id, other attributes) // doesn't change from what you have now 
Customer (id, other attributes) // doesn't change except for many-to-many; see below 
UsedVoucher(id, 
voucher, // what Voucher was used by that customer 
customer, // what Customer has used that voucher 
changed voucher attributes, // if any 
additional attributes // if needed, such as date/time when voucher was used 
) 

你的「多到多」的Customer將成爲「一個一對多」如果你需要它作爲維護屬性(由該客戶使用優惠券的集合);否則它很容易通過查詢獲取。

但是,在此場景下,您不能從Vouchers表中物理刪除,但(除非從未使用過有關憑證)。您必須改爲執行邏輯刪除。

+0

我同意你的答案。就像旁人一樣,選擇具有非規範化模式有時是合理的。在Hibernate中,代碼中的設計嚴重影響了模式。如果你使用table-per-subclass inheritance,你的問題可能會更容易做些事情。做出這樣的選擇通常意味着你將要複製數據。因此,我會停下來說這個模型是「錯誤的」。 – Lyudmil 2009-11-03 13:41:09

+1

柳德米爾 - 有不同種類的非規範化,有些比其他更容易接受。然而,在這種情況下,基於我對OP要求的理解(而且他不是很清楚,公平),我絕對建議不要將所有內容都捆綁在一張表中。您最終將獲得「基本」憑證和**多個**「聲明」憑證,導致無法獲得任何有意義的FK /業務密鑰約束。此外,我說「**似乎錯了」:-) - 再次,根據我的理解。 – ChssPly76 2009-11-03 16:57:53

1

我的建議是將所有優惠券存儲在同一張表中。要區分已使用的和未使用的,您可以使用布爾標誌或區分值(如果您在Java代碼中使用繼承)。

即使你有現有的數據,它似乎並不像遷移會非常困難。一旦所有優惠券都在同一張桌子上,他們與客戶的關係就變成了多對多的直截了當。

我認爲維護兩張表格會很困難。基本上,你仍然在存儲是否使用優惠券,但你沒有明確地做。我相信可能有一種解決方法,但我認爲我上面概述的更簡單。根據我的經驗,這是我每次遇到類似問題時所選擇的路線。