객체는 상속 관계가 있다.
관계형 DB에는 상속 관계가 없다. 하지만 슈퍼타입 서브타입 관계라는 모델링 기법을 통해 상속 관계를 유사하게 표현할 수 있다.
이런식으로 구조를 구성해야지 하면 DB는 3가지 방법을 사용해서 구현할 수 있다.
1. 각각의 테이블을 생성 = 조인 전략
2. 하나의 통합 테이블로 표현 = 단일 테이블 전략
3. 서브타입 테이블로 변환 (물품으로 묶이는 공통 속성(ex. name, price 등)들을 음반, 영화, 책에 각각 필드로 생성해주는 것, 쉽게 얘기하면 물품 테이블을 없애고 음반, 영화, 책 테이블만 만드는 것) = 구현 클래스마다 테이블 전략
@Entity
public abstract class Item {
@Id
@GeneratedValue
private Long id;
private String name;
private int price;
...
}
@Entity
public class Album extends Item{
private String artist;
...
}
@Entity
public class Book extends Item{
private String author;
private String isbn;
...
}
@Entity
public class Movie extends Item{
private String director;
private String actor;
...
}
@Entity
@Inheritance(strategy = InheritanceType.JOINED) // 조인 전략
public abstract class Item {
@Id
@GeneratedValue
private Long id;
private String name;
private int price;
...
}
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) // 단일 테이블 전략
public abstract class Item {
@Id
@GeneratedValue
private Long id;
private String name;
private int price;
...
}
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) // 단일 테이블 전략
public abstract class Item {
@Id
@GeneratedValue
private Long id;
private String name;
private int price;
...
}
[예시 코드]
@MappedSuperclass
public abstract class BaseEntity {
private String createBy;
private LocalDateTime createdDate;
private String lastModifiedBy;
private LocalDateTime lastModifiedDate;
...
}
@Entity
public class Member extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "MEMBER_ID")
private Long id;
...
}
자바 ORM 표준 JPA 프로그래밍-기본편을 학습하면서 정리한 블로그입니다.