자바와 같은 객체지향에서는 클래스끼리 상속관계가 존재하지만, 관계형 데이터베이스는 상속관계를 지원하지 않는다.
=> 관계형 데이터베이스는 슈퍼타입 서브타입 논리모델 관계 모델링 기법을 통해 객체의 상속관계를 매핑할 수 있음.
3가지 전략을 통해 매핑하기 위해서는 부모 클래스에
@Inheritance(strategy=InheritanceType.XXX)의 stategy를 설정한다.
@Inheritance(strategy=InheritanceType.XXX) : 3가지 전략 중 하나를 선택하는 어노테이션@DiscriminatorColumn(name="DTYPE") @DiscrminatorValue("XXX")import javax.persistence.*;
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "DTYPE")
public abstract class Vehicle {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// getters and setters
}
@Entity
@DiscriminatorValue("CAR")
public class Car extends Vehicle {
private int seatingCapacity;
// getters and setters
}
@Entity
@DiscriminatorValue("TRUCK")
public class Truck extends Vehicle {
private double payloadCapacity;
// getters and setters
}
@Inheritance(strategy = InheritanceType.JOINED) 를 선언하여 상속 전략을 조인 전략으로 설정@DiscriminatorColumn(name = "DTYPE")을 선언하여 하위 클래스의 값을 구분하는 컬럼 생성 (생략가능)@DiscriminatorValue("XXX") 을 선언하여 부모테이블에서 "CAR" 인지 "TRUCK" 인지 구분할 수 있도록 함
import javax.persistence.*;
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DTYPE")
public abstract class Vehicle {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// getters and setters
}
@Entity
@DiscriminatorValue("CAR")
public class Car extends Vehicle {
private int seatingCapacity;
// getters and setters
}
@Entity
@DiscriminatorValue("TRUCK")
public class Truck extends Vehicle {
private double payloadCapacity;
// getters and setters
}
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)을 선언하여 상속 전략을 단일 테이블 전략으로 설정@DiscriminatorColumn(name = "DTYPE")을 선언하여 하위 클래스를 구분하는 컬럼을 설정@DiscriminatorValue("XXX") 을 선언하여 부모테이블에서 "CAR" 인지 "TRUCK" 인지 구분할 수 있도록 함
import javax.persistence.*;
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Vehicle {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// getters and setters
}
@Entity
public class Car extends Vehicle {
private int seatingCapacity;
// getters and setters
}
@Entity
public class Truck extends Vehicle {
private double payloadCapacity;
// getters and setters
}
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS): 상속 전략을 구체 클래스당 하나의 테이블로 설정@DiscriminatorColumn 와 @DiscriminatorValue 어노테이션을 사용할 필요가 X
3가지 전략들의 장단점을 고려하여 애플리케이션의 요구사항에 맞는 전략을 선택하는 것이 중요하다.