티스토리 뷰

1. 단방향 vs 양방향


1.1.  단방향

  • 한 쪽만 참조하는 것

단방향 연관관계

 

1.2. 양방향

  • 양쪽 모두 서로 참조하는 것

 

사진을 보면 알 수 있듯이 방향은 객체관계에만 존재하고 테이블 관계는 항상 양방향


2. 양방향 연관관계


2.1. 객체 연관관계

  • 회원팀 (Member.team) : 다대일 관계
  • 회원 (Team.members) : 일대다 관계

 

2.2. 테이블 연관관계

  • 외래 키 하나로 양방향으로 조회할 수 있다.

3. 양방향 연관관계 매핑


들어가기 앞서 . . .

회원→팀 (Member.team) : 다대일 관계
팀→회원 (Team.members) : 일대다 관계

3.1. 매핑한 회원 엔티티

@Entity
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column (name = "member_id")
    private Long id;
    
    private String username;
    
    @ManyToOne
    @JoinColumn(name="team_id")
    private Team team;
    
    //연관관계 매핑
    public void setTeam(Team team){
    	this.team=team;
    }
    
    //Getter, Setter...
}
  • @ManyToOne: 회원→팀이 다대일(N:1)관계이므로
  • @JoinColumn(name="team_id")
    • 외래 키를 매핑할 때 사용
    • name 속성에는 매핑할 외래 키 이름을 지정 (매핑할 테이블의 column 어노테이션 안의 name 값)

 

3.2. 매핑한 팀 엔티티

@Entity
public class Team {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "team_id")
    private Long id;
    
    private String name;
    
    //====추가=====//
    @OneToMany(mappedBy="team")
    private List<Member> members = new ArrayList<Member>();
 	
   //Getter, Setter...
}
  • @OneToMany: 팀회원이 일대다 관계이므로
  • @mappedBy
    • Team.members는 연관관계의 주인이 아님을 설정 
    • mappedBy 속성의 값은 연관관게의 주인인 Member.team

연관관계의 주인과 반대편

 


4. 연관관계의 주인


  1. 연관관계의 주인은 테이블에 외래 키(FK)가 있는 곳으로 정한다
  2.  N:1, 1:N관계에서는 항상 "다"쪽이 외래 키(FK)를 가진다.

 → 다 쪽인 @ManyToOne은 항상 연관관계의 주인이 되므로 mappedBy를 설정할 수 없다!

위 그림에서는 member 테이블이 외래 키 team_id를 가지고 있으므로 Member.team이 주인이 된다. 

참고

  • 자바 ORM 표준 JPA 프로그래밍