2012-07-24 95 views
2

我想弄清楚在Hibernate中映射三路關係的最佳方式。以下是我的數據模型:休眠:配置3路多對多關係的最佳方式

enter image description here

正如你可以看到TeamPosition表無非是3個外鍵等等。 Hibernate以兩個表之間的ManyToMany映射的形式提供了有用的功能,還提供了一個映射表,可以在不需要創建第三個Hibernate實體的情況下將它們連接起來。當然,如果映射表有附加數據,例如「StartDate」,「EndDate」,那麼無論如何都需要爲映射表創建實體。

是否可以在每個實體上創建兩個ManyToMany映射其他兩個實體,或者如果我創建一個TeamPosition實體,並且與此具有OneToMany關係,它會變得更簡單和更少痛苦嗎?

我不一定認爲有錯誤的答案,但有些答案可能比其他

回答

1

有趣的問題!

對於clarit y:這個數據庫是否記錄了一個特定球隊在某個賽季中的聯賽組? '聯賽組'在這裏意味着什麼?像,the premier league vs the championship vs league one?在給定的賽季中,在給定的聯盟組中可以有幾支球隊?

我懷疑製作一個實體是最不痛苦的事情。這些關係都是一對多關係,您可以使用其外鍵TeamSeason構造一個組合主鍵,這將避免需要爲該表提供冗餘替代鍵。通過表連接的查詢將不得不明確地命名它,但會相當簡單。

但是,您也可以將此建模爲地圖。東西看起來像:

public class Team { 
    @ManyToMany 
    private Map<Season, LeagueGroup> positions; 
} 

安全無法保證。我以前只做過一次。如果從上述生成SQL(用我的情況下,休眠的模式發生器),您會收到以下連接表(我給我的實體整數鍵):

create table Team_LeagueGroup (
    Team_id integer not null, 
    positions_id integer not null, 
    positions_KEY integer not null, 
    primary key (Team_id, positions_KEY) 
); 

用下面的外鍵使之成爲一個更清楚一點:

alter table Team_LeagueGroup 
    add constraint FKE143A2AEB84635C9 
    foreign key (Team_id) 
    references Team; 

alter table Team_LeagueGroup 
    add constraint FKE143A2AEB7412E91 
    foreign key (positions_id) 
    references LeagueGroup; 

alter table Team_LeagueGroup 
    add constraint FKE143A2AE8F6AD5C 
    foreign key (positions_KEY) 
    references Season; 

看起來正確。您可以使用通常的註釋來自定義表格和列名稱。

現在,這避免了需要爲連接表創建實體,但它留下了一些需要的東西。首先,我不知道用什麼JPQL語法來加入這個。這將在文檔中,但你一定會得到你的偵察兵徽章來探索規範的隱祕角落以便發現它。其次,我不認爲認爲有任何方法爲此設置反向映射。問題在於,儘管球隊和賽季的組合能夠唯一確定一個聯盟組,但對於其他三個聯盟組來說並不是這樣。一個特定的球隊可能會在一個特定的聯盟小組中進行數個賽季,並且某個特定賽季中的特定聯賽小組將包含若干支球隊。反向關係需要看起來像class LeagueGroup { Map<Season, Set<Team>> teams; },我認爲這超出了JPA的力量(儘管我可能是錯的)。

+0

謝謝你的洞察力,我可以肯定地看到它變得毛茸茸的試圖做一個反向查找,所以我個人不覺得你的建議是理想的,但它肯定是我還沒有想到的東西。我會等着看別人是否有不同的可能性,如果不是,我想我會創建一個擁有OneToMany關係的TeamPosition實體。 – 2012-07-24 22:02:25