객체와 달리 관계형 데이터베이스는 상속이 존재하지 않는다. 하지만 '슈퍼타입 서브타입 관계'라는 모델링 기법이 이와 유사한데, 슈퍼타입 서브타입 모델링 기법과 상속을 매핑하는 것을 상속관계 매핑이라고 한다.
상속관계 매핑은 3가지 방법이 있다.
@Inheritance(strategy = ???)
1. 조인전략(InheritanceType.JOINED)
2. 단일 테이블 전략(InheritanceType.SINGLE_TABLE)
3. 구현 클래스마다 테이블 전략(InheritanceType.TABLE_PER_CLASS)
그림처럼 자식 테이블에 모두 부모 테이블의 PK를 주고 DTYPE, 즉 자식테이블의 종류로 구별하는 방법이 JOIN 전략이다.
• @DiscriminatorColumn(name=“DTYPE”)
• @DiscriminatorValue(“XXX”)
이 두 어노테이션을 통해서 DTYPE column 의 이름을 정하고 그 value의 이름을 설정할 수 있다.
말 그대로 부모 테이블 하나에 자식 테이블 정보를 모두 넣는 것을 의미한다.
가지고 있지 않은 속성은 null로 저장된다.
장점
- 빠르고 단순하다.
단점
- null값을 허용한다.
- 테이블이 과하게 커져 성능저하가 발생할 수 있다.
이 전략은 데이터베이스 설계자와 ORM 전문가 둘 다 추천하지 않으므로 사용하지 않는다.
@MappedSuperclass
@MappedSuperclass : 공통 매핑 정보가 필요할 때 사용하는 어노테이션
BaseEntity 와 같이 공통속성을 모아 @MappedSuperclass 어노테이션을 붙이면 다른 클래스에서 extends BaseEntity 를 통해 그 정보를 상속받을 수 있다.
• 부모 클래스는 자식 클래스에 매핑 정보만 제공한다, 엔티티로서의 기능은 수행할 수 없다.
• 직접 생성해 사용할 일이 없으니 추상 클래스를 권장한다.