본문 바로가기

Java

[JPA] 상속관계 매핑

반응형

- 관계형 DB는 상속관계 x

- 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사

- 상속관계 매핑 : 객체의 상속과 구조와 DB의 슈퍼타입, 서브탕비 관계를 매핑

 

@DiscriminatorColumn 

- 상속관계의 테이블이 어떤 테이블에서 온것인지 알 수 있다.

 - 컬럼명은 DTYPE으로 default로 생성되는데 이를 바꾸고싶다면 (name = "ColumnName")옵션을 설정해주면 된다.

 

@DiscirminatorValue

위의 사진에서 ALBUM 은 "A"로 Dtype컬럼에 저장하고  MOVIE는 "M"으로, BOOK은 "B"로 저장하고 싶다면 상속받은 각 서브클래스에 @DiscriminatorValue("A") 로 넣어주면 된다.

 

상속테이블 생성으로인한 여러개 테이블을 단일테이블로 생성하는 방법

프로젝트의 크기나 유지보수에 따라 단일테이블로 생성할 수 도 있다.  

위 사진의 테이블을 보면 ITEM테이블 한개로 앨범, 무비, 북 모든테이블을 관리할수 있도록 설게되어있으며 구분하기위해 DTYPE컬럼을 사용한다. 그렇다면 이미 만들어진 서브 엔티티들을 활용하여 어떻게 단일테이블을 만들 수 있을까???

 

package com.hellojpa;

import javax.persistence.*;

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn
public class Item {
    @Id @GeneratedValue
    private Long id;

    private String name;
    private int price;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }
}

@Inheritance 어노테이션의 starategy옵션을 SINGLE_TABLE로 주면 된다. 

단일테이블로 생성하게되면 테이블생성, insert 작업시에 한개의 쿼리만 돌기때문에 성능상의 이점을 가질 수 있다.

 

반응형

'Java' 카테고리의 다른 글

[JPA]JPQL  (0) 2022.05.11
[JPA] 값타입  (0) 2022.05.03
[JPA] Proxy, 즉시로딩, 지연로딩  (0) 2022.04.01
[JPA] 양방향 관계  (0) 2022.03.30
[JPA]  (0) 2022.03.13