상속관계 매핑
- @Inheritance(strategy = InheritanceType.JOINED)
- @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
- @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
1. 조인 전략
2. 싱글테이블 전략
3. 구현 클래스마다 테이블 전략
JPA에서 DB의 상속관계를 매핑하고 싶은경우, 단순히 자식클래스에 extends만 붙인다면
create table Item (
DTYPE varchar(31) not null,
id bigint not null,
name varchar(255),
price integer not null,
artist varchar(255),
author varchar(255),
isbn varchar(255),
actor varchar(255),
director varchar(255),
primary key (id)
)
위와 같이 싱글테이블(한 테이블에 모두 때려박음) 형식으로 생성된다
부모클래스에
@Inheritance(strategy = InheritanceType.JOINED)
어노테이션을 추가하면, 싱글테이블이 아닌 조인을 활용한 테이블로 나뉘게 된다.
이후 부모클래스만 조회에서 어떤 자식클래스인지 식별하기 위해서
@DiscriminatorColumn
어노테이션을 추가하면 , 부모클래스만을 조회하여 어떤 자식테이블의 데이터가 있는지 확인이 가능하다.
(싱글테이블 전략은 이 어노테이션을 추가하지 않아도 자동으로 추가가 되어있다.. 생각해보면 당연히 자동으로 추가가 되어 있어야 자식들간 구분이 가능하기 때문)
조인 전략의 장점
조인 전략의 단점
기본적으로 조인 전략이 객체랑 잘 맞기 때문에 정석이다
싱글 테이블의 단점
(얘는 쓰지 말자)
부모클래스의 속성까지 물려받아서 fit하게 movie 클래스에만 값이 저장된다.
-> 굉장히 좋아보이지만 별로일 수 있다...
(Item 객체도 생성하지 않는다)
부모클래스를 통해 찾을 경우
Item item = em.find(Item.class, movie.getId());
System.out.println("item = " + item);
모든 자식클래스를 union all 하여 값을 찾는다 ..
정리
조인 전략 vs 싱글 테이블 전략 중 무엇을 사용할지 고민하면 된다.
Mapped SuperClass - 매핑 정보 상속
전체적으로 공통적인 속성을 사용하고 싶은 경우 사용
@MappedSuperclass
public class BaseEntity {
@Column(name = "INSERT_MEMBER")
private String createdBy;
private LocalDateTime createdDate;
@Column(name = "UPDATE_MEMBER")
private String lastModifiedBy;
private LocalDateTime lastModifiedDate;
...
}
이후 Member, Team 클래스에서 extends BaseEntity를 해주면 끝
주의
extends를 사용할 경우의 매핑은 두 가지
@Entity -> 상속관계 매핑
@MappedSuperClass -> "속성"만 상속
실무에서 굉장히 편하게 사용할 수 있다
실전 예제 4 - 상속관계 매핑
Reference
김영한 님 - 자바 ORM 표준 JPA 프로그래밍 - 기본편