상속관계 매핑
관계형 데이터베이스는 상속 관계가 없다.(슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사하다)
슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법
1. 각각 테이블로 변환 -> 조인 전략 (정석)
- 테이블 정규화
- 외래 키 참조 무결성 제약조건 활용 가능
- 저장공간 효율화
- 조회시 조인을 많이 사용 -> 성능 저하, 조회 쿼리가 복잡함
- 데이터 저장시 INSERT 쿼리가 2번 호출 된다.
비지니스적으로 중요하고 복잡할 때 선택!
부모 클래스 설정
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn
자식 클래스 설정 -> dtype에 표시될 이름을 정해 줄 경우
@DiscriminatorValue(name = "book")
2. 통합 테이블로 변환 -> 단일 테이블 전략
한 테이블에 넣고 DTYPE 로 구분한다.
한 테이블에서 조인 없이 조회하기 때문에(조회 쿼리가 단순함) 성능이 좋다. 하지만 해당 값이 아닐 때 null이 들어간다.
한 테이블에 저장하기 때문에 데이터가 많아질 경우 조회 성능이 오히려 느려질 수 있다.
* 데이터도 없고 단순할 경우 단일 테이블 선택!
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn // 필수
3. 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략 (비추천)
- 부모 클래스가 없는 경우
- 중복 컬럼 전부 나열
- 단순하게 값을 넣고 빼기 좋지만 명확하게 조회할 때 빼고는 조회할 때 union all로 복잡한 쿼리가 생성된다.
- 각각의 테이블을 모두 조회해서 찾아야해서 비효율적이다.
Mapped Superclass - 매핑 정보 상속
공통 매핑 정보가 필요할 때 사용한다.
예를 들어 모든 클래스에 등록날짜, 수정날짜 가 있어야 한다고 했을 때 중복으로 선언 하기 보다는 공통 클래스를 만들어 상속받도록 한다.
* 상속관계 매핑은 아니다. 엔티티가 아니므로 테이블과 매핑되지 않는다. 자식 클래스에 매핑 정보만 재공할 뿐이다.
* 직접 생성해서 사용할 일이 없으므로 추상 클래스 권장한다.
@MappedSuperclass
public abstract class BaseEntity {
private LocalDateTime createdDate;
private LocalDateTime modifiedDate;
}
그 후에 해당 필드를 사용할 클래스에서 상속을 받는다. 그 후에 JPA를 실행하면 아래와 같이 상속받은 필드를 포함한 테이블을 만든다.
Hibernate:
create table Category (
CETEGORY_ID bigint not null,
createdDate timestamp,
modifiedDate timestamp,
name varchar(255),
PARENT_ID bigint,
primary key (CETEGORY_ID)
)
공통 필드의 이름이 변경되었다고 해도 MappedSuperclass 만 수정해주면 되기 때문에 유용하다.
'WEB > JPA' 카테고리의 다른 글
[Querydsl] 내가 찾아 쓰려고 정리한 글 (0) | 2022.03.15 |
---|---|
7. 자바 ORM 표준 JPA 프로그래밍 - 프록시와 연관관계 관리 (0) | 2021.05.18 |
5. 자바 ORM 표준 JPA 프로그래밍 - 다양한 연관관계 매핑 (0) | 2021.05.14 |
4. 자바 ORM 표준 JPA 프로그래밍 - 연관관계 (0) | 2021.05.14 |
3. 자바 ORM 표준 JPA 프로그래밍 - 엔티티 매핑 (0) | 2021.05.13 |