오늘은 자주 사용하는 조인테이블, 조인컬럼에 대해 공부한다.
데이터베이스는 조인컬럼, 조인테이블로 연관관계를 두가지로 설계할 수 있다.
조인컬럼은 주로 외래키 컬럼을 사용해서 관리한다. 그리고 외래키에 null을 허용하는 관계이므로 비식별관계라고 부른다.
| MEMBER |
|---|
| MEMBER_ID(PK) |
| USERNAME |
| LOCKER_ID(FK, NULL허용) |
| LOCKER |
|---|
| LOCKER_ID(PK) |
| NAME |
조인테이블은 별도의 테이블을 사용해서 연관관계를 관리한다. 즉 두 테이블의 pk를 하나의 테이블에 두어 관리한다.
| MEMBER |
|---|
| MEMBER_ID(PK) |
| USERNAME |
| MEMBER_LOCKER |
|---|
| MEMBER_ID(PK) |
| LOCKER_ID(PK) |
| LOCKER |
|---|
| LOCKER_ID(PK) |
| NAME |
일대일 조인 테이블은 외래키 컬럼 각각에 유니크 제약조건을 걸어야 한다.
joinColumns : 현재 엔티티를 참조하는 외래키
inverseJoinColumns : 반대방향 엔티티를 참조하는 외래키
@OneToOne
@JoinTable(name = "PARENT_CHILD",
joinColumns = @JoinColumn(name = "PARENT_ID"),
inverseJoinColumns = @JoinColumn(name = "CHILD_ID")
)
private Child child;
@OneToOne(mappedBy = "child")
public Parent parent;
하나의 테이블에 @SecondaryTable 을 사용해서 여러 테이블을 매핑할 수도 있다.
@Entity
@Table(name = "BOARD")
@SecondaryTable(name = "BOARD_DETAIL",
pkJoinColumns = @PrimaryKeyJoinColumn(name = "BOARD_DETAIL_ID")
)
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "BOARD_SEQ_GENERATOR")
private Long id;
private String title;
@Column(table = "BOARD_DETAIL")
private String content;
}