JPA 에서 엔티티의 연관관계를 설계하는 방법은 대표적으로 2가지가 있다.
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "member_id")
private Long id;
@Column(name = "name")
@Comment("이름")
private String name;
@OneToOne
@JoinColumn(name = "locker_id", nullable = true) // null 허용됨
private Locker locker;
}
이렇게 외래 키에 null을 허용하는 관계를 선택적 비식별 관계라 한다.
조인할 때 외부 조인(OUTER JOIN)을 사용해야 하며 아주 가끔 관계를 맺는다면 대부분 null로 저장된다.
이러한 상황에 조인 테이블을 적용하려면 위의 엔티티 코드를 아래처럼 변경해주면 된다.
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "member_id")
private Long id;
@Column(name = "name")
@Comment("이름")
private String name;
@OneToOne
@JoinTable(name = "member_locker",
joinColumns = @JoinColumn(name = "member_id"),
inverseJoinColumns = @JoinColumn(name = "locker_id"))
private Locker locker;
}
@JoinColumn을 @JoinTable로 변경해주고 각각의 옵션을 작성하면 JPA가 테이블을 아래와 같이 만들어준다.
연관 관계를 관리하는 조인 테이블(member_locker)을 추가하고 여기서 두 테이블의 외래 키를 관리한다.
조인 테이블 단점
관리해야 하는 테이블이 늘어난다.
member 테이블과 locker 테이블을 조인하려면 member_locker 테이블까지 조인해야 한다.