JVM/JPA

상속 관계 매핑 (슈퍼-서브 타입 모델링)

kyoulho 2023. 6. 17. 14:37

사용되는 어노테이션

어노테이션 설명
@Inheritance 상속 매핑은 부모 클래스에 @Inheritance를 사용해야 한다.
@DiscriminatorColumn 부모 클래스에 구분 컬럼을 지정한다. 이 컬럼으로 저장된 자식 테이블을 구분할 수 있다.
기본값은 DTYPE이다.
@DiscriminatorValue 엔티티를 저장할 때 구분 컬럼에 입력할 값을 지정한다.
만약 영화 엔티티를 저장하면 구분 컬럼인 DTYPE에 값 M이 저장된다.
지정하지 않으면 엔티티 이름을 사용한다.
@PrimaryKeyJoinColumn 기본값으로 자식 테이블은 부모의 PK 컬럼명을 사용한다.
자식 테이블의 PK 컬럼명을 변경하고 싶을때 사용한다. 

 


 

조인 전략

각각을 모두 테이블로 만들고 조회할 때 조인을 사용한다.

장점 단점 특징
테이블 정규화 조회시 조인으로 인한 성능 저하 우려 JPA 표준 명세는 구분 컬럼을 사용하도록 하지만 하이버네이트를 포함한 몇 몇 구현체는 구분 컬럼 없이도 동작한다.
외래 키 참조 무결서 제약조건 활용 조회 쿼리 복잡
저장공간 효율성 INSERT 쿼리 두번 실행

 

테이블

엔티티

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "DTYPE")
public abstract class Item {

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

    private String name;
    private int price;
}

@Entity
@DiscriminatorValue("A")
public class Album extends Item{
    private String artist;
}

@Entity
@DiscriminatorValue("M")
public class Movie extends Item{
    private String director;
    private String actor;
}

@Entity
@DiscriminatorValue("B")
@PrimaryKeyJoinColumn(name = "BOOK_ID")
public class Book extends Item{
    private String author;
    private String isbn;
}

 


 

단일 테이블 전략

테이블을 하나만 사용해서 통합한다.

 

장점 단점 특징
조인이 필요 없으므로 조회 성능이 빠르다 자식 엔티티가 매핑한 컬럼은 모두 null을 허용해야 한다. 구분 컬럼을 꼭 사용해야 한다.
조회 쿼리가 단순한다 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있다. 따라서 조회 성능이 오히려 느려지는 경우가 있다.

테이블

 

엔티티

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DTYPE")
public abstract class Item {

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

    private String name;
    private int price;
}

@Entity
@DiscriminatorValue("A")
public class Album extends Item{
    private String artist;
}

@Entity
@DiscriminatorValue("M")
public class Movie extends Item{
    private String director;
    private String actor;
}

@Entity
@DiscriminatorValue("B")
@PrimaryKeyJoinColumn(name = "BOOK_ID")
public class Book extends Item{
    private String author;
    private String isbn;
}

 


 

구현 클래스마다 테이블 전략

서브 타입마다 하나의 테이블을 만든다. 일반적으로 추천하지 않는 전략이다.

장점 단점 특징
서브 타입을 구분해서 처리할 때 효과적 여러 테이블을 함께 조회할 때 성능이 느리다. 구분 컬럼을 사용하지 않는다.
not null 제약조건을 사용할 수 있다. 자식 테이블을 통합해서 쿼리하기 어렵다.  

 

테이블

엔티티

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Item {

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

    private String name;
    private int price;
}

@Entity
public class Album extends Item{
    private String artist;
}

@Entity
public class Movie extends Item{
    private String director;
    private String actor;
}

@Entity
public class Book extends Item{
    private String author;
    private String isbn;
}

'JVM > JPA' 카테고리의 다른 글

@MapsId  (0) 2023.06.18
@MappedSuperclass  (0) 2023.06.17
복합키 매핑 @IdClass, @EmbeddedId  (0) 2023.06.16
@ManyToMany  (0) 2023.06.16
@OneToOne  (0) 2023.06.16