2016-11-04 48 views
1

我有兩張桌子,團隊和球員(一對多)。兩個表格可以互相引用嗎?

我的第一個問題是,讓兩個表互相引用是不好的做法?

Team: (id (pk), name, captain_id (fk)) 
Player: (id (pk), name, team_id (fk)) 

我正在使用JPA並使用以下設置進行休眠。

@Entity 
public class Player { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private int id; 

    private String name; 

    @ManyToOne 
    @JoinColumn(name="team_id") 
    private Team team; 
} 

@Entity 
public class Team { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private int id; 

    private String name; 
    private int captainId; 


    @OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL}) 
    private Set<Player> players; 

在當創建一個新的團隊的那一刻,球員是誰創建它的ID作爲參數傳遞。它工作正常,但手動操作並不合適。

public void createNewTeam(Player player, Team team){ 

    Set<Player> players = new HashSet<Player>(); 
    Team team = new Team("Cowboys", player.getId(), players); //player.getId is the captain() 

    player.setTeam(team); 
    players.add(player); 

    PersistenceUtil.merge(team);  
} 

有沒有辦法改變實體莫名其妙自動做到這一點?或者我需要更改表格嗎?

我一直在嘗試使用gson將對象轉換爲JSON,但無濟於事。我認爲它有一些循環參考。 (是的,我是一個太深的菜鳥!)

+0

當然可以有1-N BIDIRECTIONAL關係,這就是爲什麼關係存在!設置關係的兩邊 –

回答

-1

這是可能的,但相當有限。如果你先添加一個團隊,那麼它的隊長應該是空的,因爲你還沒有創建Player。然後,在隊長創建完成後,你必須更新你的隊伍。同樣的問題反過來。

我將開始與隊長財產移動到播放器:

Team: (id (pk), name) 
Player: (id (pk), name, team_id (fk), is_captain) 

這樣,你不必做那些更新來回。

你的功能將類似於:

public void createNewTeam(Player player, Team team){ 

Set<Player> players = new HashSet<Player>(); 
Team team = new Team("Cowboys", players);  

player.isCaptain(true); 
player.setTeam(team); 
players.add(player); 

PersistenceUtil.merge(team);  
} 
+0

我應該提到玩家/隊長創建團隊,所以它不可能在玩家之前創建團隊。在這種情況下你的答案仍然是更好的方法嗎? – superwelling

+0

'這是可能的,但相當有限' - >也許這是可能的,但絕對是不好的做法和錯誤的做法。 –

0

你在這裏描述的內容:

Team: (id (pk), name, captain_id (fk)) 
Player: (id (pk), name, team_id (fk)) 

是錯誤的,不應該被配置這樣的。

如果你想2個實體之間配置一個一對多的關聯,

然後做正確的方法是:

首先,決定哪些實體將是Many並且將是Single (One),在我們的例子中它非常簡單。每名球員屬於One球隊,而每支球隊都有Many球員。

團隊 - >一

播放器 - >許多

第二,如果你嘗試代表了表該關聯,那麼多(玩家)應該對自己的一個FK(隊) ,和Team不應該持有Player的fk,在這個聯盟中應該只有一個fk。

爲什麼?

假設你有一個團隊與211 PK團隊表中,球隊有很多球員讓我們說球員與101的100的ID,102

你不能有3條記錄(3不同的球員100,101,102)與球隊表上的相同PK 211

0

我認爲必須有一個管理員加入球隊和球員。 首先,他可以創建一個團隊,其中包含團隊的基本信息,如姓名和描述。 然後,他可以添加一個球員的詳細信息,爲他選擇一個球隊和一個標誌,以表明他是否是隊長。

所以表結構會是這樣的。

Team: (id (pk), name, description). 
Player: (id (pk), name, team_id (fk), is_captain). 

但正如你所說,一名球員可以創建球隊,那麼每個球員都有可能創建一支球隊。所以你必須通過一些角色來控制這個。

所以最好的方法是首先加入團隊,然後由管理員加入球員。