twocowsong

다 대 일 본문

IT/JPA

다 대 일

WsCode 2022. 6. 12. 19:59

 

N : 1 관계의 반대 방향은 항상 1 : N 관계입니다. 반대도 항상 동일합니다.

DB 테이블의 1, N 관계에서 외래 키는 항상 N쪽에 있습니다.

 

따라서 객체 양방향 관계에서 연관관계의 주인은 항상 N쪽입니다.

예를들어 회원(N)과 팀(1)이 있으면 회원 쪽이 연관관계의 주인입니다.

 

N : 1 [ 다대일 단방향 ]

 

회원은 Member.team으로 팀 엔티티를 참조할 수 있지만

반대로 팀에는 회원을 참조하는 필드가 없습니다.

따라서 회원과 팀은 N : 1 단방향 연관관계입니다.

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

@JoinColumn(name = "TEAM_ID")를 사용해서 Member.team필드를 TEAM_ID외래 키와 매핑했습니다.

따라서 Member.team필드로 회원 테이블의 TEAM_ID외래키를 관리하게됩니다.

 

N : 1, 1 : N [ 다대일 양방향 ]

객체의 연관관계의 주인은 Member.team이고 Team.members은 연관관계의 주인이 아닙니다.

public class Member {

   @Id
   @Column(name="MEMBER_ID")
   private String id;

   private String username;

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

   // 연관관계 설정
   public void setTeam(Team team) {
      this.team = team;

      if (!team.getMembers().contains(this)) {
         team.getMembers().add(this);
      }
   }

   // Getter, Setter...
}
public class Team {

   @Id
   @Column(name = "TEAM_ID")
   private String id;

   private String name;

   @OneToMany(mappedBy = "team")
   private List<Member> members = new ArrayList<>();

   public void addMember(Member members) {
      this.members.add(members);
      if (members.getTeam() != this) {
         members.setTeam(this);
      }
   }
}

 

양방향은 외래키가 있는 쪽이 연관관계의 주인입니다.

1 : N, N : 1 연관관계는 항상 N에 외래키가 있습니다.

여기서 N 쪽인 MEMBER테이블이 외래 키를 가지고있으므로 Member.team이 연관관계의 주인입니다.

JPA는 외래 키를 관리할 때 연관관계의 주인만 사용합니다.

주인이 아닌 Team.members는 조회를 위한 JPQL이나 객체 그래프를 탐색할 때 사용합니다.

 

양방향 연관관계는 항상 서로를 참조해야 합니다.

어느 한 쪽만 참조하면 양방향 연관관계가 성립되지 않습니다. 

setTeam(), addMember() 메소드가 이런 편의 메소드들입니다.

이런편의 메소드들을 사용할때는 무한루프에 빠지지지않도록 주의해야합니다.

'IT > JPA' 카테고리의 다른 글

일 대 다 양방향  (0) 2022.06.14
일 대 다  (0) 2022.06.13
연관관계의 주인(mappedBy)  (0) 2022.06.11
정리  (0) 2022.06.09
실전 예제  (0) 2022.06.07