상속관계 매핑
- 조인전략
- 단일테이블전략
- 구현클래스마다 테이블전략
어떤 전략이든을 선택하든 객체는 똑같이 구현된다.
하지만 DB 설계에서는 전략에따라 테이블 구성이 달라진다.
주요 어노테이션
- @Inheritance(strategy = InheritanceType.XXX)
JOINED : 조인전략
SINGLE_TABLE : 단일테이블전략
TABLE_PER_CLASS : 구현클라스당 테이블 전략 - @DiscriminatorColumn(name='DTYPE') : DTYPE 부분 컬럼 이름 지정 가능
- @DiscriminatorValue("XXX") : DTYPE부분 도메인 이름 지정 가능
조인전략
테이블
ITEM 테이블이 존재한다.
그리고 각 ALBUM, MOVIE, BOOK 테이블이 존재하고 ITEM 테이블을 상속받는다.
JPA로 구현
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn : 무조건 써줘야함
Item
Book
단일테이블전략
테이블
ITEM 테이블 하나에 다 때려박는다.
JPA로 구현
@DiscriminatorColumn 안써줘도 DTYPE 들어간다.
-> 순서는? 기본적으로 숫자가 아니라 객체 이름으로 들어가서 걱정 안해도 된다.
Item
Book
구현클래스마다 테이블 전략
테이블
ITEM을 생성안하고 자식 테이블들만 생성된다.
그래서 DTYPE이 아예 필요없고 @DiscriminatorColumn가nbsp;필요없다.
그런데, 부모타입으로 조회할때 전부 다 비교해야 하기때문에 복잡한 쿼리가 나간다
JPA로 구현
실무에서 사용 안하기 때문에 생략한다.
정리
장점 | 단점 | |
조인 (정석) | 1. 테이블이 정규화 2. 외래 키 참조 무결성 제약조건 활용 가능 (다른 테이블에서 외래키 하나로 조회 가능하다) 3. 저장공간 효율화 |
1. 조회시 조인을 많이 사용해서 조회쿼리가 복잡하다. 성능 낮다 2. 데이터 저장시 insert 쿼리 두개 나감 그런데 그렇게 성능 저하가 크진 않다. |
단일테이블 | 1. 조인이 필요없어서 조회성능이 빠르다 2. 조회 쿼리가 단순하다 |
1. 자식 엔티티가 매핑한 컬럼은 모두 null을 허용해줘야한다. 2. 오히려 한 테이블에 때려박아서 조회성능이 안좋아질 수 있다. |
구현클래스마다 테이블 (안씀) | 안쓰므로 생략 | 안쓰므로 생략 |
조인 전략을 기본으로 깔고가고, 엄청 단순해서 확장가능성이 없으면 단일테이블을 써라.
@MappedSuperclass
여러 엔티티에서 공통으로 사용되는 매핑정보가 있을때 사용한다.
특징
- 상속아님.
- 엔티티아님.
- 조회도 안됨.
그니깐 abstract 로 써라
구현코드
package jpabook.jpashop.domain;
import javax.persistence.Column;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;
@MappedSuperclass
public abstract class BaseEntity {
@Column(name = "INSERT_MEMBER")
private String createdBy;
private LocalDateTime createDate;
@Column(name = "UPDATE_MEMBER")
private String lastModifiedBy;
private LocalDateTime lastModifiedDate;
public String getCreatedBy() {
return createdBy;
}
public void setCreatedBy(String createdBy) {
this.createdBy = createdBy;
}
public LocalDateTime getCreateDate() {
return createDate;
}
public void setCreateDate(LocalDateTime createDate) {
this.createDate = createDate;
}
public String getLastModifiedBy() {
return lastModifiedBy;
}
public void setLastModifiedBy(String lastModifiedBy) {
this.lastModifiedBy = lastModifiedBy;
}
public LocalDateTime getLastModifiedDate() {
return lastModifiedDate;
}
public void setLastModifiedDate(LocalDateTime lastModifiedDate) {
this.lastModifiedDate = lastModifiedDate;
}
}
'Web > JPA' 카테고리의 다른 글
EP10. 값 타입 (0) | 2021.02.12 |
---|---|
EP9. 프록시와 연관관계 관리 (0) | 2021.02.10 |
EP7. 다양한 연관관계 매핑 (0) | 2021.02.08 |
EP6. 연관관계 매핑 (실전예제) (0) | 2021.02.06 |
EP5. 연관관계 매핑 (0) | 2021.02.05 |