2016-11-04 3 views
1

두 개의 테이블, 팀 및 플레이어 (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-Captain을 만든 후에 팀을 업데이트해야합니다. 동일한 문제가 그 반대입니다.

내가 선수로 주장 속성을 움직이는 시작할 것 :

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)) 

이 잘못을하고, 그와 같이 구성 할 수 없습니다.

당신이 두 기관 사이에 많은 관계로 하나를 구성 할 경우,

을 할 수있는 올바른 방법

는 것입니다 :

우선하는 것 Many 될 것이다 실체 결정 Single (One)이됩니다. 우리의 경우에는 꽤 간단합니다. 각 플레이어는 One 팀에 속하며 각 팀의 선수는 Many 명입니다.

팀 -> 하나

플레이어 -> 많은

둘째, 하나의 FK을 소유해야 테이블과 그 관계 후 많은 (플레이어)를 표현하기 위해 (팀)을 시도 할 것이다 경우 , 팀은 Player의 fk를 보유해서는 안됩니다.이 협회에는 단 하나의 fk 만 있어야합니다.

왜?

의 당신이 (211)의 PK로 팀의 테이블에 팀을 보유한다고 가정 해 봅시다, 그 팀은 3 (3 개 기록을 가질 수 없습니다 (102)

, 많은 선수의 100의 ID, 101 플레이어라고 할 수있다 다른 플레이어 100, 101, 102)가 같은 PK를 가진 팀 테이블 211

0

두 팀과 선수를 추가하는 관리자가 있어야한다고 생각합니다. 먼저 이름과 설명 같은 팀에 대한 기본 세부 정보가 포함 된 팀을 만들 수 있습니다. 그런 다음 세부 정보가 포함 된 플레이어를 추가하고 팀을 선택하고 자신이 선장인지 여부를 나타내는 플래그를 표시 할 수 있습니다.

그래서 테이블 구조는 이와 같습니다.

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

하지만 플레이어가 팀을 만들면 모든 플레이어가 팀을 만들 수 있습니다. 그래서 당신은 어떤 역할에 의해 이것을 제어해야 할 것입니다.

따라서 관리자를 먼저 팀에 추가하고 관리자를 추가하는 것이 좋습니다.

관련 문제