슈퍼타입 서브타입 관계
모델링 기법이 그나마 객체 상속과 유사하다.상속관계 매핑
: 객체의 상속과 구조와 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
이므로 생략해도 된다.→ 한 테이블에 모두 저장되었다.
@DiscriminatorColumn
DTYPE
속성에 자식 클래스의 엔티티 이름이 들어간다.@Entity
@DiscriminatorColumn
public class Item { ... }
→ DTYPE
이 생겼다.
실제 데이터들을 모두 별도의 테이블에 저장하는 방법! 이 전략은 데이터베이스 설계자와 ORM 전문가 둘 다 추천하지 않으므로 사용하지 말자!!😣
not null
제약조건을 사용할 수 있다.UNION SQL
필요) 📌 정리
- 기능이 단순하고 확장 가능성도 적으면 단일 테이블 전략
- 비즈니스적으로 중요하고, 복잡하고, 확장 가능성이 높으면 조인 전략
객체 입장에서 공통 매핑 정보가 필요할 때 사용한다! (Ex.
id
,name
)
em.find(BaseEntity)
불가) 📌 참고
@Entity
클래스는 엔티티나@MappedSuperclass
로 지정한 클래스만 상속 가능하다!