연관관계를 클래스에서는 필드에서 다른 객체를 갖도록 해 구현한다. 연관관계에서 매핑시 다중성, 단/양방향, 연관관계 주인을 고려해야 한다.
다중성은 @OneToMany 등으로 설정하며, 방향은 양쪽 클래스 모두에 서로의 객체 필드가 있는지 여부로 결정하고, 연관 관계 주인은 외래키를 관리하는 클래스이다.
연관 관계 주인은 FK를 갖는쪽으로 설정하며 @JoinColumn 으로 FK 명을 입력하고, 반대쪽은 mappedBy 로 필드명을 입력한다.
이번 포스팅에서는 다야항 연관관계에서 다중성, 연관관계 주인등을 어떻게 설정해야 하는지 알아보자
가장 많이 사용하는 연관관계. N 쪽이 연관관계의 주인이 된다.
주로 사용하지 않는 연관관계. 1 쪽이 연관관계 주인이 된다. 일대다 대신 다대일을 사용하자.
FK 를 갖고 있지 않은 쪽이 연관관계의 주인이 되는 일대다는 사용하지 말자. @ManyToOne에 mappedBy 속성이 없어 양방향 매핑이 어렵다.
연관관계의 주인은 반드시 FK를 가진 쪽에 두는 다대일 관계를 사용하자.
일대일 관계는 주 테이블과 대상 테이블 중 어디에 FK를 둘지 선택이 가능하다.
Member 마다 하나의 Locker 를 할당하는 Member-Locker 관계를 보자.
Member 에 외래키
Locker 에 외래키
객체지향 개발자는 주 테이블(Member)에 외래키를 두는 방식을 선호한다.
RDBMS 에서는 다대다 관계를 표현할 수 없기에 관계 테이블을 둔다. 하지만 객체에서는 서로 List 객체를 필드로 두며 다대다 관계가 가능하다. 그래서 JPA 는 다대다 관계를 확인하면 자동으로 관계테이블을 생성해준다.
다대다 매핑에서는 JPA 가 자동으로 관계테이블을 생성해준다. 그러나 관계 테이블에 컬럼을 추가할 수 있는 방법이 없다.
따라서 관계테이블을 직접 엔티티로 생성하고, 기존 테이블과 @OneToMany @ManyToOne 관계로 맺어서 사용한다. FK 는 관계 테이블이 갖으므로 관계 테이블이 모든 연관관계의 주인이 된다.
1:N 관계는 반드시 FK 를 갖는 테이블이 연관관계의 주인이 되도록 설계하자.
1:1 관계는 테이블 설계시 FK 를 누가 가질지 결정할 수 있다. 결정된 FK 를 갖는 쪽이 연관관계의 주인이 되도록 하자.
N:M 관계는 다대다 매핑을 사용하면 관계테이블 컬럼 추가가 불가능하므로 관계 테이블을 엔티티로 등록해서 사용하자.