有趣的問題!
對於clarit y:這個數據庫是否記錄了一個特定球隊在某個賽季中的聯賽組? '聯賽組'在這裏意味着什麼?像,the premier league vs the championship vs league one?在給定的賽季中,在給定的聯盟組中可以有幾支球隊?
我懷疑製作一個實體是最不痛苦的事情。這些關係都是一對多關係,您可以使用其外鍵Team
和Season
構造一個組合主鍵,這將避免需要爲該表提供冗餘替代鍵。通過表連接的查詢將不得不明確地命名它,但會相當簡單。
但是,您也可以將此建模爲地圖。東西看起來像:
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的力量(儘管我可能是錯的)。
謝謝你的洞察力,我可以肯定地看到它變得毛茸茸的試圖做一個反向查找,所以我個人不覺得你的建議是理想的,但它肯定是我還沒有想到的東西。我會等着看別人是否有不同的可能性,如果不是,我想我會創建一個擁有OneToMany關係的TeamPosition實體。 – 2012-07-24 22:02:25