Entity
일대다 연관 관계 매핑

 

읽기 전에 참고하면 좋은 글

 

 

일대다 단방향 매핑

1. 멤버와 팀이 N : 1 관계로 있다.
2. 멤버는 하나의 팀에만 소속될 수 있고, 한 팀당 여러명의 멤버가 있을 수 있다.
3. 연관 관계의 주인은 팀(1).

우선, 주인이 누구냐에 상관 없이 항상 다(N) 쪽에 외래키가 있는 사실은 변함이 없다.

 

객체간 연관 관계의 주인이 Team이기 때문에 Team이 갖고있는 List members에 생기는 변화에 따라 Member 테이블이 갖고 있는 외래키 TEAM_ID가 업데이트 된다.

 

외래키를 관리해야 하는 연관 관계 주인 객체가 외래키를 갖고 있지 않는다.

 

이런 객체와 테이블의 차이 때문에 결국 반대편 테이블의 외래키를 관리해야 하는 특이한 구조를 가졌다.

 

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

Team 입장에서 봤을 때 일대다 매핑이며, 연관 관계의 주인이 되므로 JoinColumn을 붙여주자.

 

단방향 매핑이므로 Member에는 따로 Team 객체를 생성하지 않아도 된다.

 

DB에 반영해보면 일대다 역시 매핑이 잘 된 모습이다.

 

하지만 대부분의 경우에서 연관 관계의 주인은 외래키를 소지한 엔티티로 정한다.

 

여러가지 이유가 있지만 이 경우 가장 큰 이유로는 쿼리문 실행에 있다.

 

Member 객체와 Team 객체를 생성 후 DB에 반영한 쿼리문이다.

 

마지막에 update문이 실행된 것이 보인다. (create문은 주석이다.)

 

다대일 매핑에서는 update문이 실행되지 않는데, 일대다 매핑에서만 실행된다.

 

왜냐하면, 연관 관계의 주인은 Team인데 외래키를 보유하는 쪽은 Member라서,

Team에 있는 PK 정보를 갖고 Member의 외래키 정보를 업데이트 해주는 것이다.

 

 

 

일대다 양방향 매핑

단방향 매핑만으로도 이미 연관관계 매핑은 끝났다.

 

양방향 매핑은 단순히 반대 방향으로 조회하기 위한 기능을 객체에 추가하는 것 뿐이다.

 

 

단방향 매핑 후 양쪽을 서로 참조할 수 있도록 상대 객체에도 매핑을 해주면 된다.

 

사실, 일대다에서 양방향 매핑이란 것은 공식적으로 존재하지 않는다.

 

@ManyToOne에는 mappedBy가 없기 때문이다.

 

하지만 양방향을 사용하는 목적에 걸맞게 흉내낼 수는 있다.

@Entity
@Getter
@Setter
public class Member {
    @ManyToOne
    @JoinColumn(insertable = false, updatable = false)
    private Team team;

}

 

Team 엔티티와 마찬가지로 JoinColumn을 넣어주고 insertableupdatablefalse로 두어 읽기 전용 필드로 만들면 양쪽 모두에서 값을 참조할 수 있다.

 

 

결론

일대다 단방향은 일대다(1 : N)에서 일(1)이 연관관계의 주인이다.

 

테이블의 일대다 관계는 항상 다(N) 쪽에 외래키가 있다.

 

객체와 테이블의 차이 때문에 반대편 테이블의 외래 키를 관리해야 하므로 update 쿼리가 필수적으로 실행된다. (비효율적)

 

특별한 이유가 있지 않는 한 연관 관계의 주인은 외래키를 보유한 쪽으로 설정하자. (N쪽)

 

 

 

 

 

 

 

 

복사했습니다!