2015년 12월 30일 수요일

Entity Inheritance Mapping Strategies

당신은 Java Persistence provider가 javax.persistence.Inheritance 어노테이션이 선언되어 있는
root class로부터 상속받은 entity를 맵핑시키게 설정할 수 있다.
아래의 멥핑 전략은 database에 있는 entity data를 맵핑시키는 것에 사용된다.

- A single table per class hierarchy

- A table per concrete entity class

- A “join” strategy, whereby fields or properties that are specific to a subclass are mapped to a different table than the fields or properties that are common to the parent class

상속 전략은 @Inheritance의 옵션 중 하나인 strategy 요소에서 아래의 InheritanceType의 enum 타입 중 하나를 고를 수 있다.

public enum InheritanceType {
    SINGLE_TABLE,
    JOINED,
    TABLE_PER_CLASS
};

entity 계층의 root class에서 @Inheritance 어노테이션에 아무런 strategy가 선언되어 있지 않다면,
기본 전략으로, InheritanceType.SINGLE_TABLE로 선언된다.

The Single Table per Class Hierarchy Strategy

기본적인 InheritanceType.SINGLE_TABLE 전략을 선언하면 모든 상속받은 클래스들은 Database의 하나의 테이블에 맵핑된다.
이 테이블은 discriminator column 을 가지게 되고, 이 칼럼은 어떠한 subclass가 이 데이터 행을 소유하는지 표시하게 된다.

discriminator column의 요소는 아래와 같다.
@DiscriminatorColumn 요소
1. name (String)
discriminator column의 이름, 선택적인 값이며 기본 값은 DTYPE 이다.
2. discriminatorType (DiscriminatorType)
discriminator column에 사용될 column의 종류. 선택적인 값이며 기본 값은 DiscriminatorType.String이다.
3.length(String)
DiscriminatorType.String 기반의 칼럼을 위한 칼럼의 길이이다.다른 DiscriminatorType일 때에는 이 값이 무시된다.
선택적인 값이며 기본 값은 31이다.

javax.persistence.DiscriminatorType의 enum값은 @DiscriminatorColumn을 설정하기위해
사용되는 값이다.

public enum DiscriminatorType {
    STRING,
    CHAR,
    INTEGER
};

@DiscriminatorColumn 이 root entity에 선언되어있지 않다면, Persistence provider는 기본적으로 column 이름을
DTYPE, column type은 DiscriminatorType.String으로 유추한다.

@DiscriminatorValue는 구체적인 클래스에 선언되어질 수 있다.
@DiscriminatorValue가 선언되어 있지않으면, 기본 값으로 각 entity의 이름을 discriminatorValue로 사용하게 된다.

이 전략은 entity들 사이의 다형성 관계에 좋은 전략이고, 모든 상속받은 entity class를 커버하기에 좋은 전략이다.
하지만, 이 전략은 각각의 subclass들의 column들이 null인 값을 가지게 만든다.

The Table per Concrete Class Strategy

이 전략은 각각의 구현된 상속받은 클래스들이 database의 분리된 table에 맵핑된다. 상속받은 fields와 properties를 포함하여 모든 fields와 properties는
database의 각 class의 table에 맵핑되게 된다.

이 전략은 다형성에 좋지않고, 종종 union query를 사용하거나 subclass마다 구분된 SQL query를 사용하게 만든다.

이 전략은 선택적이고, 모든 Java Persistence API provider에 의해 지원되지 않을 수 있다. 기본적인 Java Persistence API provider인
GlassFish Server는 이 전략을 지원하지 않는다.

The Joined Subclass Strategy

이 전략에서 root class는 하나의 테이블에 맵핑되어 있고, 상속받은 각각의 subclass들은 각각의 구분된 table을 가지게 된다.
이 테이블들은 오직 subclass만의 fields를 가지게 된다.
즉, subclass의 table은 상속받는 fields와 properties를 가지고 있지않다는 얘기이다. 그리고 각각의 subclass 테이블들은
각각의 primary key이자 super class에게 foreign key인 column을 가지게 된다.

이 전략은 다형성에 좋지만 join 동작을 사용하기 때문에 낮은 성능을 보이게 된다.

몇몇 Java Persistence API provider는 joined subclass strategy를 사용할 때 discriminator column을 요구한다.


original source : https://docs.oracle.com/javaee/6/tutorial/doc/bnbqn.html

댓글 없음 :

댓글 쓰기