
슈퍼타입 서브타입 관계 모델링 기법이 그나마 객체 상속과 유사하다.상속관계 매핑: 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑하는 것이다.Item 테이블을 Album, Movie, Book 테이블과 조인한다.⭐ 데이터베이스 입장에서는 3가지로 나뉘지만, 객체 입장에서는 모두 동일하다.
📌 주요 어노테이션
@Inheritance(strategy=InheritanceType.XXX)의strategy옵션 설정으로 매핑 방법을 고를 수 있다.
JOINED: 조인 전략SINGLE_TABLE: 단일 테이블 전략 (default값)TABLE_PER_CLASS: 구현 클래스마다 테이블 전략@DiscriminatorColumn(name=“DTYPE”)
- 부모 클래스에 선언. 하위 클래스를 구분하는 용도의 컬럼.
@DiscriminatorValue(“XXX”)
- 하위 클래스에 선언. 엔티티를 저장할 때 슈퍼타입의 구분 컬럼에 저장할 값을 지정.

엔티티 각각을 테이블로 만들고, 자식 테이블이 부모의 기본키를
기본키 + 외래키로 사용한다.
null을 넣는 부분이 없다)INSERT SQL 2번 호출해야 한다.@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Item { ... }
JOINED 설정!
→ 테이블 생성
try {
Movie movie = new Movie();
movie.setDirector("aaaa");
movie.setActor("bbbb");
movie.setName("바람과 함께 사라지다");
movie.setPrice(10000);
em.persist(movie);
tx.commit();
}


서비스 규모가 크지 않고, 굳이 조인 전략을 선택해서 복잡하게 갈 필요가 없을 때 사용한다!
DTYPE으로 구분한다.null 이 들어간다.INSERT 쿼리도 한 번, SELECT 쿼리도 한 번!null을 허용해야 한다. (데이터 관점에서 좋지 않다😨)@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Item { ... }
default가 SINGLE_TABLE이므로 생략해도 된다.
→ 한 테이블에 모두 저장되었다.
@DiscriminatorColumnDTYPE 속성에 자식 클래스의 엔티티 이름이 들어간다.@Entity
@DiscriminatorColumn
public class Item { ... }

→ DTYPE이 생겼다.

실제 데이터들을 모두 별도의 테이블에 저장하는 방법! 이 전략은 데이터베이스 설계자와 ORM 전문가 둘 다 추천하지 않으므로 사용하지 말자!!😣
not null 제약조건을 사용할 수 있다.UNION SQL 필요) 📌 정리
- 기능이 단순하고 확장 가능성도 적으면 단일 테이블 전략
- 비즈니스적으로 중요하고, 복잡하고, 확장 가능성이 높으면 조인 전략
객체 입장에서 공통 매핑 정보가 필요할 때 사용한다! (Ex.
id,name)

em.find(BaseEntity) 불가) 📌 참고
@Entity클래스는 엔티티나@MappedSuperclass로 지정한 클래스만 상속 가능하다!