Reference. 자바 ORM 표준 JPA 프로그래밍
책 목차 및 이전 글
더보기
들어가기 전 JPA 특징, Q&A
1. JPA 소개
3. 영속성 관리
4. 엔티티 매핑
4.1 - 4.3 @Entity, @Table, 다양한 매핑
4.4 - 4.5 데이터베이스 스키마 자동 생성, DDL 생성 기능
5. 연관관계 매핑 기초
6. 다양한 연관관계 매핑
7. 고급매핑
7.4 조인 테이블
데이터베이스 테이블의 연관관계를 설계하는 방법 크게 2가지
- 조인 컬럼 사용(외래 키)
- 조인 테이블 사용(테이블 사용)
조인 컬럼 사용
LOCKER
를 선택적으로 입력 받는 상황에선 선택적 비식별 관계를 사용 (외래 키 null 허용)
- 선택적 비식별 관계는 조인할 때 외부 조인(
OUTER JOIN
)을 사용 실수로 내부 조인을 사용하면 사물함이 없는 회원은 조회되지 않음
- 아주 가끔 관계를 맺는다면 외래 키 값 대부분이 null로 저장되는 단점
조인 테이블 사용
- 연관관계를 관리하는 조인 테이블(
MEMBER_LOCKER
)을 추가하고 외래 키를 가지고 관리
- 단점은 테이블을 하나 추가해야 한다는 점, 관리 테이블과 조인 횟수가 증가
- 조인 테이블은 주로 다대다 관계를 일대다, 다대일 관계로 풀기위해 사용 그렇지만 일대일, 일대다, 다대일 관계에서도 사용가능
7.4.1 일대일 조인 테이블
일대일 조인 테이블 매핑
//부모
@Entity
public class Parent {
@Id @GeneratedValue
@Column(name = "PARENT_ID")
private Long id;
private String name;
@OneToOne
@JoinTable(name = "PARENT_CHILD",
joinColumns = @JoinColumn(name = "PARENT_ID"),
inverseJoinColumns = @JoinColumn(name = "CHILD_ID"))
private Child child;
...
}
//자식
@Entity
public claass Child {
@Id @GeneratedValue
@Column(name = "CHILD_ID")
//@OneToOne(mappedBy="child") 양방향으로 매핑하는 경우 사용
private Long id;
private String name;
...
}
@JoinTable 속성
name
: 매핑할 조인 테이블 이름
joinColumns
: 현재 엔티티를 참조하는 외래 키
inverJoinColumns
: 반대방향 엔티티를 참조하는 외래 키
7.4.2 일대다 조인 테이블
- 다(N)와 관련된 컬럼인
CHILD_ID
에 유니크 제약 조건이 필요
일대다 단방향 조인 테이블 매핑
//부모
@Entity
public class Parent {
@Id @GeneratedValue
@Column(name = "PARENT_ID")
private Long id;
private String name;
@OneToMany
@JoinTable(name = "PARENT_CHILD",
joinColumns = @JoinColumn(name = "PARENT_ID"),
inverseJoinColumns = @JoinColumn(name = "CHILD_ID"))
private List<Child> child = new ArrayList<Child>();
...
}
//자식
@Entity
public class Child {
@Id @GeneratedValue
@Column(name = "CHILD_ID")
private Long id;
private String name;
}
7.4.3 다대일 조인 테이블
//부모
@Entity
public class Parent {
@Id @GeneratedValue
@Column(name = "PARENT_ID")
private Long id;
private String name;
@OneToMany(mappedBy = "parent")
private List<Child> child = new ArrayList<Child>();
...
}
//자식
@Entity
public class Child {
@Id @GeneratedValue
@Column(name = "CHILD_ID")
private Long id;
private String name;
@ManyToOne(optional = false)
@JoinTable(name = "PARENT_CHILD",
joinColumns = @JoinColumn(name = "CHILD_ID"),
inverseJoinColumns = @JoinColumn(name = "PARENT_ID"))
private Parent parent;
...
}
7.4.4 다대다 조인 테이블
- 조인 테이블의 두 컬럼을 합해 하나의 복합 유니크 제약조건 설정
다대다 조인 테이블 매핑
//부모
@Entity
public class Parent {
@Id @GeneratedValue
@Column(name = "PARENT_ID")
private Long id;
private String name;
@ManyToMany
@JoinTable(name = "PARENT_CHILD",
joinColumns = @JoinColumn(name = "PARENT_ID"),
inverseJoinColumns = @JoinColumn(name = "CHILD_ID"))
private List<Child> child = new ArrayList<Child>();
...
}
//자식
@Entity
public class Child {
@Id @GeneratedValue
@Column(name = "CHILD_ID")
private Long id;
private String name;
...
}
<참고>
- 조인테이블에 컬럼을 추가하면 @JoinTable 전략을 사용 못함, 새로운 엔티티를 만들어 매핑
'개발서적 > 자바 ORM 표준 JPA' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍] 8.1~2 프록시, 즉시 로딩과 지연 로딩 (0) | 2021.08.25 |
---|---|
[자바 ORM 표준 JPA 프로그래밍] 7.5 엔티티 하나에 여러 테이블 매핑 (0) | 2021.08.18 |
[자바 ORM 표준 JPA 프로그래밍] 7.3 복합 키와 식별 관계 매핑 (0) | 2021.08.18 |
[자바 ORM 표준 JPA 프로그래밍] 7.2 @MappedSuperclass (0) | 2021.08.18 |
[자바 ORM 표준 JPA 프로그래밍] 7.1 상속 관계 매핑 (0) | 2021.08.18 |