연관관계 매핑이란 객체의 참조와 테이블의 외래키를 매핑하는 것을 의미한다.
JPA에서는 JDBC(Mybatis)를 사용했을 때와 달리 연관 관계에 있는 상대 테이블의 PK를 멤버변수로 갖지 않고, 엔티티 객체 자체를 통째로 참조한다.
이전 'Gallery'프로젝트를 만들 땐 category 테이블의 id값만 참조하는 형식으로 만들었었다.
간단하게 말해서 외래 키를 등록, 수정, 삭제할 수 있는 엔티티가 주인이다.
이전 'Gallery' 프로젝트에서는 한 개의 작품(Art)이 한 개의 분류(Category)에만 속했기 때문에 category의 id를 Art가 가지고 있는 방식으로 구현했지만
이번 프로젝트의 숙소는 여러개의 편의시설을 가지고 있을 수도 있고 편의시설 역시 여러개의 숙소의 포함될 수 있으므로 다대다 연관관계로 설정하였다.
다대다(ManyToMany)관계일 경우 두 테이블의 외래키를 복합키로 하여 PK를 갖는 테이블을 따로 생성하게 된다.
JPA에서는 테이블 생성을 따로 할 필요 없이 어노테이션을 달아주면 자동으로 중간 테이블을 생성해준다.
// 숙소 엔티티
@Getter
@NoArgsConstructor
@Entity
public class Home {
...생략
// 편의시설 관계 매핑
@ManyToMany
@JoinTable(name = "home_facilities", joinColumns = @JoinColumn(name = "home_id"),
inverseJoinColumns = @JoinColumn(name = "facilities_id"))
private List<Facilities> facilities = new ArrayList<>();
...생략
}