본문 바로가기
Java/JPA

[SpringBoot_JPA_1] @Inheritance @DiscriminatorColumn

by HJ0216 2023. 5. 22.

이 글은 김영한의 [실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발] 수강하며 정리한 글입니다.

 

 

🟦 기본 환경: IDE: IntelliJ, Language: Java

📚 수정일: 2023년 05월 30일

 

 

@Inheritance

Entity Class간 상속 관계를 나타내는 Annotation

1. InheritanceType.SINGLE_TABLE: 단일 테이블 전략

 - 부모 클래스와 자식 클래스의 모든 속성을 단일 테이블에 저장

 - DTYPE 컬럼을 사용하여 엔티티 타입을 식별

2. InheritanceType.JOINED: 구분 컬럼 전략

 - 각 클래스마다 별도 테이블 생성, 부모 클래스의 속성은 부모 테이블에, 자식 클래스의 속성은 자식 테이블에 저장

 - 조인을 사용하여 관련 테이블을 연결

 - 각 테이블은 자식 클래스의 속성만을 포함하며, 공통된 속성은 부모 테이블에 저장

3. InheritanceType.TABLE_PER_CLASS: 서브클래스 테이블 전략

 - 각 클래스마다 별도의 테이블을 생성, 각 테이블에 해당 클래스의 속성이 저장
 - 공통된 속성은 부모 클래스에 저장되지 않음

 

@DiscriminatorColumn(name = "DTYPE")

: JPA에서 상속 관계를 매핑할 때 사용되는 Annotation

: 부모 클래스에 선언되며, 하위 클래스를 구분하는 용도의 컬럼을 생성

: 하위 클래스에서 @DiscriminatorValue를 통해 DTYPE 컬럼에 저장될 값을 지정

: @DiscriminatorColumn과 @DiscriminatorValue를 사용하여 상속 계층 구조에서 엔티티 클래스를 식별하면, JPA는 적절한 타입의 객체를 가져오고 다양한 타입의 객체를 사용하는 쿼리를 작성할 수 있음

 

상위 Entity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@DiscriminatorColumn(name = "dtype")
@Getter @Setter
public abstract class Item {
 
    @Id @GeneratedValue
    @Column(name = "item_id")
    private Long id;
 
    private String name;
 
    private int price;
    private int stockQuantity;
}
 
 
cs

 

하위 Entity

1
2
3
4
5
6
7
8
9
@Entity
@DiscriminatorValue("A")
@Getter @Setter
public class Album extends Item {
 
    private String artist;
    private String etc;
}
 
 
cs

 

→ 상위 Entity table에 dtype이라는 column이 생성되고 Item을 상속하는 Album class는 dtype column에 "A"값으로 저장됨