관계형 데이터베이스는 상속 관계가 없지만 JPA는 객체 상속과 유사한 슈퍼타입, 서브타입의 논리 모델으로 상속관계 매핑을 구현할 수 있다.

 

@Inheritance(strategy=InheritanceType.XXX ) : 상속 선언, 전략 설정

@DiscriminatorColumn(name="DTYPE") : 부모 클래스에서 자식 테이블을 구분할 수 있는 타입 Column

@DiscriminatoerValue("XXX") : 자식 클래스에 입력하는 DTYPE 이름으로 생략 시, 엔티티명으로 생성

 

 

@InheritanceType

 

1. JOINED

각각 테이블로 생성, 외래 키 참조 무결성 제약조건을 따르면서 저장 공간을 효율적으로 나눌 수 있지만 조회 시 조인을 많이 사용하며 쿼리가 복잡하고 INSERT를 2번 호출해야하는 단점이 있다.

 

2. SINGLE_TABLE

DTYPE으로 자식 테이블을 구분할 수 있기 때문에 하나의 테이블에 전부 집어넣는 단일 테이블 방식으로 조회 쿼리가 단순하고 빠르지만 테이블이 너무 커질 수 있고 자식 Column에 null 값을 허용해야 하는 단점이 있다.

 

3. TABLE_PER_CLASS 

조회 시 UNION SQL이 필요하고 성능이 느리고 자식 테이블을 통합해서 쿼리하기 어려운 문제 등으로 권장 X

 

 

@MappedSuperclass

 

공통 속성이 필요한 경우 이를 상속으로 뺄 수 있는데 이는 실제 테이블에 영향을 주는 것은 아니고 단순하게 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할만 한다. 직접 생성하거나 사용할 일이 없으므로 추상 클래스로 사용하는 것이 좋고 엔티티가 생기는 것이 아니기 때문에 당연히 조회, 검색 등은 할 수 없다.

 

 

 

 

 

+ Recent posts