관계형 데이터베이스에는 상속 관계가 없다. 하지만 슈퍼 타입 서브 타입 관계로 이를 어느정도 지원한다.
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Item{
private Long id;
private String name;
private int price;
}
@Entity
public class Movie extends Item{
private String author;
private String isbn;
}
가장 정석적인 전략이다. InheritanceType 속성 값이 JOINED로 설정되어 있다.
각 테이블을 만들고 외래 키를 통해 조인으로 관계를 구성한다. ALBUM 테이블에 데이터를 삽입하면 ITEM과 ALBUM 테이블 모두에 값이 저장된다.
장점
단점
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn
public class Item{
private Long id;
private String name;
private int price;
}
@Entity
@DiscriminateValue("M")
public class Movie extends Item{
private String author;
private String isbn;
}
단일 테이블 전략에서는 @DiscriminatorColumn을 필수적으로 사용해야 한다. 이를 통해 하나의 테이블에 필요한 모든 컬럼을 포함하고, DTYPE 컬럼이 자동으로 생성되어 ITEM의 종류를 구분하는 방식으로 매핑된다.
@DiscriminatorValue 어노테이션으로 테이블의 이름을 지정할 수 있다.
이 전략에서는 INSERT 쿼리가 한 번만 실행되고 조인이 발생하지 않아 성능이 더 효율적이다.
장점
단점
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Item {
@Id @GeneratedValue
private Long id;
private String name;
private int price;
}
사용이 권장되지 않는 전략이다.
이 전략은 각 아이템 타입마다 별도의 테이블을 생성한다. ITEM 테이블은 생성하지 않으며, 대신 각 하위 테이블에 ITEM의 모든 속성이 중복되어 포함된다.
장점
단점