Lined Notebook

[Spring Data JPA] 20. JPA 상속관계 매핑 실전 예제

by ymkim

✔ 상속관계 매핑

이번 장에서는 실습 위주로 진행이 됩니다.
💡 상속관계 매핑에 대한 추가적인 내용은 해당 링크를 참고 해주세요. 🤣

✅ 요구사항 추가

  • 상품의 종류는 도서, 음반, 영화가 있고 이후 더 확장될 수 있다.
  • 모든 데이터는 등록일과 수정일이 필수다.

✅ 도메인 모델

상속관계매핑

상품(물품) 테이블에 도서, 음반, 영화를 추가하였다.

✅ 도메인 모델 상세

2022-02-19_상속관계매핑_도메인모델_상세

도메인 모델에도 마찬가지로 위 세가지(도서, 음반, 영화)를 추가.

✅ 테이블 설계

2022-02-19_상속관계매핑_테이블설계

테이블은 싱글 테이블로 설계.

⚡ 실습 예제

✅ Item 도메인

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) // 단일 테이블 전략
@DiscriminatorColumn // DTYPE 사용
public abstract class Item {

    @Id
    @GeneratedValue
    @Column(name = "ITEM_ID")
    private Long id;

    private String name; // 상품명
    private int price; // 가격
    private int stockQuantity; // 재고 - 수량

    @ManyToMany(mappedBy = "items")
    private List<Category> categories = new ArrayList<>();
    //.. Getter, Setter 중략
}

Item 엔티티(Entity)에 @Inheritance, @DiscriminatorColumn 어노테이션을 추가한다.

✅ Album, Book, Moive 엔티티 상속 관계 추가

@Entity
public class Album extends Item {

    private String artist;
    private String etc;
    //.. Getter, Setter 중략
}
@Entity
public class Book extends Item {

    private String author;
    private String isbn;
    //.. Getter, Setter 중략
}
@Entity
public class Movie extends Item {

    private String director;
    private String actor;
    //.. Getter, Setter 중략
}

Albumn, Book, Movie는 Item 엔티티를 상속한다. 또한 Item 엔티티는 현재 단일 테이블 전략추상 클래스로 선언이 되어있다.

🖨️ 출력 결과

Hibernate:

    create table Item (
       DTYPE varchar(31) not null,
        ITEM_ID bigint not null,
        name varchar(255),
        price integer not null,
        stockQuantity integer not null,
        artist varchar(255),
        etc varchar(255),
        actor varchar(255),
        director varchar(255),
        author varchar(255),
        isbn varchar(255),
        primary key (ITEM_ID)
    )

단일 테이블 전략을 사용하였기에 다른 테이블(Album, Book, Movie)들은 생성이 되지 않고 Item 테이블에 모든 필드가 초기화된 것을 확인 할 수 있다.

참고 자료

블로그의 정보

기록하고, 복기하고

ymkim

활동하기