2016-11-04 81 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). 

但正如你所说,一名球员可以创建球队,那么每个球员都有可能创建一支球队。所以你必须通过一些角色来控制这个。

所以最好的方法是首先加入团队,然后由管理员加入球员。