[5단원] 양방향 연관관계의 매핑

양방향 연관관계의 매핑

@Entity(name = "Member")
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Setter
public class Member {
    @Id
    @Column(name = "MEMBER_ID")
    private String id;
    
    private String username;
    
    // 연관관계 매핑
    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    private Team team;
    
    public Member(String id, String username) {
        this.id = id;
        this.username = username;
    }
}
@Entity
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Getter
public class Team {
    
    @Id
    @Column(name = "TEAM_ID")
    private String id;
    
    private String name;
    
    @OneToMany(mappedBy = "team")
    private List<Member> members = new ArrayList<>();
}
  • 다대다 설정 Team 에 회원이 여러명
  • Member 는 하나의 팀만 들어갈수있다
  • 조회해보자
@Test
    void find_team1_all_member() {
        Team team1 = em
            .find(Team.class, "team1");
        List<Member> members = team1.getMembers();
        for (Member member : members) {
            System.out.println("member = " + member.getUsername());
        }
    }
  • 단순히 이렇게만 조회하면 당연히 값이 안나온다.
  • 왜냐?
    • 양방향 연관관계에서 member에서만 팀을 설정해주고 team 에서는 member 를 추가해주지 않았기 때문이다.
    • 고로.. 아래의 코드 처리가 필요하다
public void setTeam(Team team) {
        this.team = team;
        team
            .getMembers()
            .add(this);
    }
  • 위 코드는 안전해보이나요?
    • 아니다,
      • 만약 member에서 team1 을 지우지 않은 상태에서 team2 로 변경하게 된다면
      • team1 은 여전히 Member 를 가지고 있지만,
      • Member는 team2 와의 관계를 가지게 되기 때문에
        • 데이터의 무결성을 해치게 된다.
  • 고로 아래의 안전장치가 필요하다.
public void setTeam(Team team) {
        if (this.team != null) {
            this.team
                .getMembers()
                .remove(this);
        }
        this.team = team;
        team
            .getMembers()
            .add(this);
    }
  • team 이설정이 되어있는 경우
  • 별도 team 안에서 해당 team 객체를 지워주면 된다.

이제 올바르게 출력된다

insert into member (team_id, username, member_id) values ('team1', '회원1', 'member1');
member = 회원1 (출력!)

Uploaded by N2T