관계형 데이터베이스에는 객체지향 언어에서 다루는 상속이라는 개념이 없다.
관계형 데이터베이스에서는 슈퍼타입 - 서브타입 관계 라는 모델링 기법이 객체의 상속 개념과 가장 유사하다.
슈퍼타입 - 서브타입 논리 모델
객체 상속 모델
ORM에서 이야기하는 상속 관계 매핑은 객체의 상속 구조와 데이터베이스의 슈퍼타입 서브타입 관계매핑은 객체의 상속 구조와 데이터베이스의 슈퍼타입 서브타입 관계를 매핑하는 것이다.
각각의 테이블로 변환 : 각각을 모두 테이블로 만들고 조회할 때 조인을 사용한다. JPA에서는 조인 전략이라고 한다.
통합 테이블로 변환 : 테이블을 하나만 사용해서 통합한다. JPA에서는 단일 테이블 전략이라 한다.
서브타입 테이블로 변환 : 서브 타입마다 하나의 테이블을 만든다. JPA에서는 구현 클래스마다 테이블 전략이라 한다.
// 조인 전략 매핑 예제
@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;
...
}
기본값으로 자식 테이블은 부모 테이블의 ID 컬럼명을 그대로 사용한다.
자식 테이블의 기본 키 컬럼명을 변경하고 싶다면 @PrimaryKeyJoinColumn을 사용하면 된다.
// ID 재정의 예제
@Entity
@DiscriminatorValue("B")
@PrimaryKeyJoinColumn(name = "BOOK_ID") // ID 재정의
public class Book extends Item {
private String author; // 작가
private String isbn; // ISBN
...
}
부모 클래스인 Item 클래스의 ID 컬럼명인 ITEM_ID 대신에
@PrimaryKeyJoinColumn을 사용하여 BOOK_ID로 기본 키 컬럼명을 재정의했다.
장점
단점
특징
관련 애너테이션
Book 엔티티를 저장한다고 가정하면, ITEM 테이블의 AUTHOR,ISBN 컬럼만 사용하므로,
다른 엔티티와 매핑된 ARTIST,DIRECTOR,ACTOR 컬럼은 사용하지 않기 때문에 null이 입력된다.
// 단일 테이블 전략 매핑 예제
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DTYPE")
public abstract calss Item {
@Id @GeneratedValue
@Column(name = "ITEM_ID")
private Long id;
private String name;
private int price;
...
}
@Entity
@DiscriminatorValue("A")
public class Album extends Item { ... }
@Entity
@DiscriminatorValue("M")
public class Movie extends Item { ... }
@Entity
@DiscriminatorValue("B")
public class Book extends Item { ... }
장점
단점
특징
// 구현 클래스마다 테이블 전략 매핑 예제
@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 { ... }
@Entity
public class Movie extends Item { ... }
@Entity
public class Book extends Item { ... }
이 전략은 데이터베이스 설계자와 ORM 전문가 둘 다 추천하지 않는 전략이다.