상속할 테이블
@Entity
@Inheritance(strategy = InheritanceType.XXX) // 상속 구현 전략 선택
public class Item {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private int price;
}
Item을 상속받은 테이블
@Entity
public class Album extends Item {
private String artist;
}
각각을 테이블로 전환하여 슈퍼타입의 ID를 서브타입의 PK, FK로 연결
@Inheritance(strategy=InheritanceType.JOINED)
장점 : 테이블 정규화 / 외래키 참조 무결성 제약조건 활용 가능 / 저장공간 효율화
단점 : 조회 시 조인 연산이 많아 쿼리가 복잡해지고 성능 저하 / 데이터 저장 시 insert SQL 2번 호출
하나의 테이블로 구현하여 슈퍼, 서브타입의 모든 속성을 한 테이블의 컬럼으로 지님
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
장점 : 조인이 필요없어 쿼리가 단순해짐 / 일반적으로 조회 성능이 빠름
단점 : 자식 엔티티가 매핑한 컬럼에 모두 null 허용이 적용됨 / 테이블이 커질 경우 오히려 조회 성능 저하될 수 있음
서브타입마다 각각의 테이블로 구현하여 슈퍼타입의 속성 모두 포함
* 각각의 테이블을 하나로 묶을 수 없어 사용 지양
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
장점 : 서브 타입을 명확하게 구분해서 이를 처리할 때 효과적 / not null 제약조건 사용 가능
단점 : 여러 자식 테이블을 함께 조회할 때 성능이 느림 (UNION SQL 필수) / 자식 테이블을 통합해서 쿼리하기 어려움
두 테이블 join해서 사용
// 슈퍼타입 엔티티
@DiscriminaterColumn(name = "DTYPE")
// 서브타입 엔티티
@DiscriminatorValue("entity_name") //default=entity_name
상속이 아닌 공통 매핑 정보가 필요할 때 사용하며 주로 전체 엔티티에 대해 공통으로 지닌 속성에 대해 정의 예) 등록 수정일, 등록자, 수정자 등
슈퍼 클래스는 직접 생성해 사용할 일이 없음으로 추상 클래스로 권장
서브타입에 속성 정보만 제공함으로 슈퍼타입으로 조회, 검색 불가
슈퍼클래스
@Getter
@Setter
@MappedSuperclass
public abstract class BaseEntity {
private String createdBy;
private LocalDateTime createdDate;
private String lastModifiedBy;
private LocalDateTime lastModifiedDate;
}
서브 클래스
@Entity
public class Member extends BaseEntity {
}
[SPRING] JPA 프로그래밍 기본 | 객체지향 쿼리 언어 (0) | 2021.04.08 |
---|---|
[SPRING] JPA 프로그래밍 기본 | 값 타입 (0) | 2021.04.08 |
[SPRING] JPA 프로그래밍 기본 | 프록시와 지연로딩 (0) | 2021.03.11 |
[SPRING] JPA 프로그래밍 기본 | 연관관계 (0) | 2021.03.09 |
[SPRING] JPA 프로그래밍 기본 | JPA와 영속성 (3) | 2021.03.08 |
댓글 영역