상속관계 매핑
관계형 데이터베이스는 상속 관계가 아니다. 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사하다.
상속관계 매핑은 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑한다.
슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법은 3가지가 존재한다.
- 각각 테이블로 변환 -> 조인 전략
- 통합 테이블로 변환 -> 단일 테이블 전략
- 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략
조인 전략
package hellojpa;
import javax.persistence.*;
@Entity
@Inheritance(strategy = InheritanceType.JOINED) //Item을 상속을 join으로 설정
@DiscriminatorColumn //Dtype을 추가해준다.
public class Item {
@Id
@GeneratedValue
private Long id;
private String name;
private int price;
}
//각각 테이블이 생김
@DiscriminateValue("a")로 자식 클레스에서 Dtype이름을 변경해 줄 수 있다
장단점
장점
- 테이블 정규화
- 외래 키 참조 무결성 제약조건 활용 가능
- 저장공간 효율화
단점
- 조회시 조인을 많이 사용, 성능 저하
- 조회 쿼리가 복잡함
- 데이터 저장시 INSERT SQL 2번 호출
단일 테이블 전략
모든 객체를 테이블 하나 만드는 것이다.
package hellojpa;
import javax.persistence.*;
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) //Item을 상속을 단일테이블로 설정
@DiscriminatorColumn //Dtype을 추가해준다.
public class Item {
@Id
@GeneratedValue
private Long id;
private String name;
private int price;
}
장단점
장점
- 조인이 필요 없으므로 일반적으로 조회 성능이 빠름
- 조회 쿼리가 단순함
단점
- 자식 엔티티가 매핑한 컬럼은 모두 null 허용
- 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있다. 상황에 따라서 조회 성느이 오히려 느려질 수 있다.
구현 클래스마다 테이블 전략
조인 전략이랑 비슷하지만 ITEM 속성없이 모두 각각 테이블로 주요키를 내린다.
package hellojpa;
import javax.persistence.*;
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Item { //추상 클래스로 설정
@Id
@GeneratedValue
private Long id;
private String name;
private int price;
}
이 전략은 추천하지 않는다.
장단점
장점
- 서브 타입을 명확하게 구분해서 처리할 때 효과적이다.
- not null 제약 조건을 사용 가능하다.
단점
- 여러 자식 테이블을 함께 조회할 때 성능이 느려진다. union을 사용한다
- 자식 테이블을 통합해서 쿼리하기 어렵다.
@MappedSuperclass
그림처럼 공통 매핑 정보가 필요할 때 사용한다.
DB는 이렇게 ID와 name 둘 다 있는 상태로 저장된다.
만약 멤버와 팀에 누가 만들었는지, 언제 만들었는지, 누가 변경했는지, 언제 변경했는지를 둘 다 저장하고 싶을 때 MappedSupperclass를 사용한다.
package hellojpa;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;
@MappedSuperclass
public class BaseEntity {
private String createBy;
private LocalDateTime createdDate;
private String lastModifiedBy;
private LocalDateTime lastModifiedDate;
}
이런 BaseEntity를 만들어 Member와 Team에 상속해주면 된다.
- 상속관계 매핑이 아니다. 엔티티가 아니고 테이블과 매핑하지 않는다.
- 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공한다.
- 조회,검색 불가
- 직접 생성해서 사용할 일이 없으므로 추상 클래스 권장한다.
테이블과 관계 없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할이다.
주로 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통 으로 적용하는 정보를 모을 때 사용한다.
@Entity 클래스는 엔티티나(엔티티는 상속관계) @MappedSuperclass로 지 정한 클래스만 상속 가능하다.
강의 출처 : https://www.inflearn.com/course/ORM-JPA-Basic
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com
'BackEnd > 자바 ORM 표준 JPA 프로그래밍' 카테고리의 다른 글
JPA -프록시와 연관관계 관리 (0) | 2022.12.28 |
---|---|
실전 예제 4 - 상속관계 매핑 (0) | 2022.12.27 |
실전 예제 3 - 다양한 연관관계 매핑 (0) | 2022.12.26 |
JPA 다양한 연관관계 매핑 (0) | 2022.12.26 |
JPA 실전 예제2 - 연관관계 매핑 시작 (0) | 2022.12.23 |