DTYPE
DTYPE 이란?
Discriminator Column Type으로 JPA와 Hibernate에서 상속 전략을 구현할 때, 사용되는 개념이다.
이 컬럼은 기본적으로 Single Table 상속 전략을 사용할 때, 자동으로 생성되지만, 다른 상속 전략에서도 사용할 수 있다. JPA에서 Entity 상속을 처리하기 위한 주요 전략은 Single Table 전략, Table Per Class 전략, Joined Table 전략이 있다.
Single Table 전략
Single Table 전략은 모든 엔티티를 하나의 테이블로 저장하며, DTYPE 컬럼을 통해 각 레코드의 실제 엔티티 유형을 구분한다.
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DTYPE")
public abstract class Item {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// common fields
}
@Entity
@DiscriminatorValue("SWORD")
public class Sword extends Item {
// fields specific to TaskQueue
}
@Entity
@DiscriminatorValue("AXE")
public class Axe extends Item {
// fields specific to TaskQueueHistory
}
Table Per Class 전략
Table Per Class 전략은 각 엔티티마다 별도 테이블을 생성하며, 상속 구조의 모든 필드를 포함한다. 이 전략에서는 DTYPE 컬럼은 필요하지 않다. 그러나 별도 테이블이 생성되면, 성능 상의 이슈가 발생할 수 있으므로 주의가 필요하다.
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Item {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// common fields
}
@Entity
public class Sword extends Item {
// fields specific to TaskQueue
}
@Entity
public class Axe extends Item {
// fields specific to TaskQueueHistory
}
Joined Table 전략
Joined Table 전략은 기본 엔티티의 필드를 상위 테이블에 저장하고, 하위 엔티티의 필드를 별도 테이블에 저장하여 조인을 통해 데이터를 조회한다. 이 전략 역시 DTYPE 컬럼은 필요하지 않다.
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Item {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// common fields
}
@Entity
public class Sword extends Item {
// fields specific to TaskQueue
}
@Entity
public class Axe extends Item {
// fields specific to TaskQueueHistory
}
댓글남기기