Skip to main content Link Search Menu Expand Document (external link)

양방향 연관관계와 연관관계의 주인

1. 양방향 연관관계

img.png

  • 회원은 하나의 팀에만 소속될 수 있음.

회원 한명은 여러 팀에 소속 될 수 없음.
팀은 여러명의 회원을 가질 수 있음.

n명의 회원은 같은 팀에 들어갈 수 있음.

member : team = N : 1

테이블 연관관계에서는 N인 쪽에서 FK를 가짐.
그럼 테이블 연관관계와 같이 객체연관관게에서도 N인쪽에서 연관관계를 매핑해야함.

@Entity
public class Member{
    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    private Team team;
}
@Entity
public class Team{
    @OneToMany(mappedBy="team")
    private List<Mebmer> members = new ArrayList<>();
}

객체 연관관계는 단방향 2개가 존재, 참조 값 2개.
회원 -> 팀
팀 -> 회원

테이블 연관관계는 참조 값 1개.
회원 <-> 팀 (외래키로 조회)

테이블은 외래키 하나로 두 테이블의 연관관계를 관리함.

Member 객체와 Team 객체 둘 중 한곳에서 외래 키를 관리해야함.

2. 연관관계의 주인

  • 객체 두 관계중 하나를 연관관계의 주인으로 지정해야함.
  • 연관관계의 주인만이 외래 키를 관리함(등록, 수정)
  • 주인이 아니쪽은 읽기만 가능해야함.

누구를 주인으로

외래 키가 있는 곳을 주인으로 정해야함.

변경을 할때 다른 테이블로 쿼리가 날라감. 방지하기 위해서 외래 키가 있는 곳으로 정함.

주의사항

  • 연관관계의 주인이 아닌 객체에서 연관관계의 주인의 값을 입력하면 DB에 반영이 안됨.
  • 양방향 매핑시 양쪽 다 값을 입력해야함.

    양쪽 다 값을 설정하지 않을 경우에 em.flush()가 없을때 값을 찾을 수 없게됨. 1차 캐시에 값이 없기 때문에 List members를 조회할 수 없음.

  • 양방향 매핑시 무한 루프 조심해야함.

    양쪽에서 객체를 부르기 때문에 무한 루프에 빠짐.

설계할때 단방향 매핑만으로 하고 필요할때 추가하는 쪽이 좋음.