✔ 깃허브 소스코드
✔ Udemy 강의영상
✔ SINGLE_TABLE
@Entity
@Getter
@Table(name = "employees")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "EMPLOYEE_TYPE")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public abstract class Employee {
@Id
@GeneratedValue
private Long id;
@Column(nullable = false)
private String name;
public Employee(String name) {
this.name = name;
}
@Override
public String toString() {
return String.format("Employee[%s]", this.name);
}
}
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class PartTimeEmployee extends Employee {
private BigDecimal hourlyWage;
@Builder
public PartTimeEmployee(String name, BigDecimal hourlyWage) {
super(name);
this.hourlyWage = hourlyWage;
}
}
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class FullTimeEmployee extends Employee {
private BigDecimal salary;
@Builder
public FullTimeEmployee(String name, BigDecimal salary) {
super(name);
this.salary = salary;
}
}
@Inheritance
의 strategy
의 기본값은 SINGLE_TABLE
입니다.SINGLE_TABLE
은 상속 관계에 있는 테이블들을 모두 합쳐서 하나의 테이블로 저장합니다. 즉, 부모 테이블만 생성됩니다.DTYPE
이라는 새로운 칼럼이 생성되고, 이 칼럼은 어떠한 자식 클래스인지 구분해줍니다. 해당 칼럼명은 @DiscriminatorColumn
어노테이션으로 재정의 할 수 있습니다.null
값이 생성되므로 데이터베이스 설계면에서는 비효율적입니다.✔ TABLE_PER_CLASS
@Entity
@Getter
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public abstract class Employee {...}
UNION
을 사용하고 성능도 준수한 편입니다.✔ JOINED
@Entity
@Getter
@Inheritance(strategy = InheritanceType.JOINED)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public abstract class Employee {...}
JOIN
연산을 수행하므로 성능면에서는 떨어집니다.✔ Mapped Super Class
@Getter
@MappedSuperclass
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public abstract class Employee {...}
@MappedSuperClass
가 선언되어 있는 클래스는 엔티티가 아닙니다. 당연히 테이블과 매핑도 안됩니다.TABLE_PER_CLASS
와 같은 형태로 생성됩니다.Note
💨 JPA에서@Entity
클래스는@Entity
나@MappedSuperClass
로 지정한 클래스만 상속 받을 수 있습니다.
데이터베이스 디자인과 무결성을 고려한다면 JOINED
방식을 추천합니다.
그러나 성능을 더 고려한다면 SINGLE_TABLE
을 추천합니다.
반면에 TABLE_PER_CLASS
하고 Mapped Super Class
를 사용하게 된다면 각 테이블마다 중복되는 칼럼이 생성되므로 비추천합니다.