객체의 참조와 테이블의 외래 키의 매핑

객체의 연관관계는 참조 > .getTeam()

테이블은 연관관계는 외래키

 

용어 이해

방향 : 단방향, 양방향

다중성 : 다대일, 일대다, 일대일, 다대다

연관관계의 주인 : 객체 양방향 연관관계는 관리가 필요

 

객체지향의 오해와 진실/오브젝트 책 추천

 

 

 

테이블 연관관계에서 다대일(N:1) 관계일 경우 

 

 

하나의 팀에서 여러명의 멤버일때 

팀:멤버 = 1:N 

 

  • Member 클래스에서 Team 클래스를 쓸 때 연관관계는 @ManyToOne
  • Member 객체는 MEMBER 테이블의 FK와 조인해야해서  @JoinColumn(name = "TEAM_ID")
@Entity
public class Member {

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

}

 

 

 

 

 

가장 중요!

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

 

 

 

양방향 참조할 수 있는것 

 

보다시피 위에서 정리했던 단방향 연관관계의 테이블과 전혀 변화가 없다. 

MEMBER의 FK와 TEAM의 PK와 조인만 하면 양쪽으로 연관관계를 다 알 수 있다.

문제는 객체! 멤버에서 팀은 갈수 있으나 팀에서 멤버는 못갔다 

그래서 팀에 List members를 넣어준다. 

 

 

 

mappedBy = "team"

 

팀과 멤버는 일대다 관계여서 @OneToMany 

@Entity
public class Team {

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

}

 

mappedBy = "team" 는 멤버 클래스의 team 과 매핑이 되어있는 상태이다 라는 뜻

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

 

 

 

 

객체와 테이블이 관계를 맺는 차이

  • 객체 연관관계 (2개) : 사실 양방향 관계가 아닌 서로 다른 단방향 관계 2개
    • 멤버 > 팀 = 1개 (단방향)
    • 팀 > 멤버 = 1개 (단방향)
  • 테이블 연관관계 = 1개 
    • 멤버 <> 팀 = 1개 (양방향 , 사실 방향이 없음)

 

 

 

단방향 연관관계를 2개 만들어서 객체를 양방향으로 참조한 것!

객체의 연관관계

 

 

 

외래키 하나로 양방향 연관관계를 가짐 (양쪽으로 조인가능)

테이블의 연관관계

 

 

연관관계의 주인

 

양방향 매핑에서 나옴

객체 두 관계 중 하나를 연관관계의 주인으로 지정해야하는데 

주인만이 외래 키를 관리(등록, 수정) 하고 주인이 아니면 읽기만 가능

 

주인은 mappedBy 속성 사용할 수 없으며 주인이 아니면 mappedBy 속성으로 주인을 지정해야한다.  

@Entity
public class Team {

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

}


mappedBy = "team"라는 의미는 'team에 의해 관리가 된다'는 뜻
team은 Member 클래스에 있으며
결론적으로 여기에서 값을 수정해봤자 소용이 없고 조회만 가능하다. 
@Entity
public class Member {

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

}

여기는 연관관계의 주인

 

 

결론

누구를 주인으로 하는가?  외래 키가 있는 곳을 주인으로 정해야한다!!

다대일 은 외래키가 있는 곳이 '다' 고 외래키가 없는곳이 '일'이다

다시 말해, '다' 쪽이 외래키가 있어서 무조건 연관관계의 주인이다.

 

그러면 덜 헷갈린다

 

반응형
LIST

+ Recent posts