조인 전략
(1) 슈퍼타입과 서브타입으로 각각의 테이블을 따로둔다
(2) 슈퍼타입 테이블에 서브타입 테이블의 정보(DTYPE)를 추가한다.
(3) 서브타입 테이블의 정보를 가져갈 때 (2)의 정보와 조인을해서 데이터를 가져온다.
장점 : 정규화가 되어있다. 외래 키 참조 무결성 제약조건 활용가능, 저장공간 효율화
단점 : 조회시 쿼리가 복잡하고 조인을 많이 사용 (비교적 성능↓)
단일 테이블 전략
(1) 하나의 테이블에 모든 상속관계를 다 넣어둔다.
(2) 서브타입 정보를 알 수 있는 정보(DTYPE)를 추가한다.
장점 : 조회 쿼리가 단순하고 빠르다.
단점 : 자식 엔티티가 매핑한 컬럼은 모두 NULL 허용, 상황에 따라 성능↓
구현 클래스마다 테이블 전략
(1) 구현 클래스에 저장되어있는 정보로 각각 테이블을 만든다.
안 쓰는 전략
객체 입장에서는 무슨 전략을 선택하던지 영향을 받지 않는다.
@Entity
@Inheritance(strategy = InheritanceType.~)
@DiscriminatorColumn //DTYPE
public class Parent{
...
}
@Entity
@DiscriminatorColumn
public class Child extends Parent{
...
}
...
Child child = new Child();
child.set(...);
em.persist(child);
...
중복되는 속성을 모아놓은 클래스에 @MappedSuperClass를 달아두고
사용할 클래스에서 상속받아놓으면 간단하게 중복코드를 줄일 수 있다.
이 클래스는 Entity가 아니고 매핑 정보만 제공할 뿐이다.
따라서 이 클래스를 직접 사용 할 일이 없으므로 추상 클래스로 만들어두는 게 권장된다.