상속관계 매핑 : 객체의 상속 구조와 DB의 슈퍼타입 서브타입 관계를 매핑 김영한의 자바 ORM 표준 JPA 프로그래밍
슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법 - 각각 테이블로 변환 ⇒ 조인 전략 - 통합 테이블로 변환 ⇒ 단일 테이블 전략 - 서브 타입 테이블로 변환 ⇒ 구현 클래스마다 테이블 전략 (실무사용X)
주요 어노테이션
@Inheritance(strategy=InheritanceType.XXX) : 테이블을 어떻게 구현할지 전략을 설정한다. - JOINED : 조인 전략 - SINGLE_TABLE : 단일 테이블 전략 (default 전략) - TABLE_PER_CLASS : 구현 클래스마다 테이블 전략 (실무사용X)
DiscriminatorColumn(name="DTYPE") : 부모 클래스에 선언하며, 하위 클래스를 구분하는 용도로 사용한다. 관례는 default인 DTYPE을 사용한다.
DiscriminatorValue("XXX") - 하위 클래스에 선언하며, 엔티티를 저장 시 슈퍼타입의 구분 컬럼에 저장할 값을 지정한다. - @DiscriminatorValue 를 선언하지 않았을 경우 클래스 이름이 들어간다.
조인 전략
김영한의 자바 ORM 표준 JPA 프로그래밍
장점 : 테이블 정규화, 외래 키 참조 무결성 제약조건 사용가능, 저장공간 효율화
단점 : 조회시 조인사용으로 인한 성능저하, 조회 쿼리가 복잡함, 데이터 저장 시 INSERT SQL 2번 호출
단일 테이블 전략
김영한의 자바 ORM 표준 JPA 프로그래밍
장점 : 조인이 필요 없으므로 일반적으로 조회 성능이 빠름, 조회 쿼리가 단순
단점 : 자식 엔티티 매핑한 컬럼은 모두 null을 허용한다. 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있어 오히려 조회 성능이 저하할 수 있다.
구현 클래스마다 테이블 전략 ( 실무사용X )
김영한의 자바 ORM 표준 JPA 프로그래밍
장점 : 서브타입을 명확하게 구분해 처리할 때 효과적, not null 제약조건 사용가능
단점 : 여러 자식 테이블을 함께 조회 시 성능이 느림(JNION SQL 필요), 자식 테이블을 통합해서 쿼리하기 어려움
@MappedSuperclass
공통 매핑정보가 필요할 때 사용한다. 김영한의 자바 ORM 표준 JPA 프로그래밍
객체관계에서는 class를 구현하나 실제 DB의 관계에는 변화가 없으므로 Entity class관리에 용이하다. 김영한의 자바 ORM 표준 JPA 프로그래밍
상속관계 매핑, 엔티티, 테이블과 매핑되지 않는다.
부모 클래스를 상속받은 자식 클래스에 매핑 정보만을 제공(관계X)한다.
조회, 검색 불가(em.find(BaseEntity) 불가)
직접 생성해서 사용할 일이 없으므로 추상 클래스를 권장한다.
@MappedSuperclass
public abstract class BaseEntity {
// DB에서 실제 사용될 컬럼명을 지정할 수 있다.
@Column(name = "INSERT_MEMBER")
private String createdBy;
private LocalDateTime createdDate;
@Column(name="UPDATE_MEMBER")
private String lastModifiedBy;
private LocalDateTime lastModifiedDate;
...
}
테이블과 실제 관계를 맺지 않고, 단순히 엔티티만을 공통으로 사용하는 매핑 정보를 모으는 역할을 한다.
주로 등록/수정일, 등록/수정자 같은 전체 엔티티에서 공통으로 적용하는 정보를 모을 때 사용한다.
참고 : @Entity 클래스는 엔티티나 @MappedSuperclass로 지정한 클래스만 상속이 가능하다.