상속 관계의 종류
단일 테이블 전략 (Single Table Strategy): 이 전략은 상속 계층의 모든 엔티티를 하나의 테이블에 매핑합니다. 이 테이블에는 부모와 자식 엔티티의 모든 속성이 포함됩니다. 엔티티_유형(Discriminator 컬럼)을 사용하여 각 엔티티의 유형을 식별합니다.공통 속성과 자식 엔티티의 속성 모두 하나의 테이블에 존재하며, 자식 엔티티의 속성이 없는 경우에는 null 값으로 채워집니다.
조인 테이블 전략 (Joined Table Strategy): 이 전략은 상속 계층의 각 엔티티를 별도의 테이블에 매핑합니다. 부모 엔티티와 자식 엔티티 간의 관계는 조인 테이블을 사용하여 정의됩니다.부모 엔티티와 자식 엔티티 간의 관계는 외래 키(FK)를 사용하여 정의됩니다. 각 엔티티는 자체적으로 필요한 속성을 가지며, 공통 속성은 부모 엔티티 테이블에 저장됩니다.
@Inheritance 어노테이션
JPA에서 상속 관계를 매핑할 때 @Inheritance 어노테이션을 사용합니다.
@Entity
@Inheritance(strategy = InheritanceType.전략)
public class 부모클래스 {
// 부모 엔티티의 속성과 메서드 정의
}
@Entity
public class 자식클래스1 extends 부모클래스 {
// 자식 엔티티 1의 속성과 메서드 정의
}
@Entity
public class 자식클래스2 extends 부모클래스 {
// 자식 엔티티 2의 속성과 메서드 정의
}
@DiscriminatorColumn 어노테이션
단일 테이블 전략을 사용할 때, 부모 엔티티와 자식 엔티티를 식별하기 위한 컬럼을 지정하는 데 @DiscriminatorColumn 어노테이션을 사용합니다.
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "엔티티_유형") //기본값 "DTYPE"
public class 부모클래스 {
// 부모 엔티티의 속성과 메서드 정의
}
@DiscriminatorValue 어노테이션
단일 테이블 전략을 사용할 때, 각 자식 엔티티를 구분하기 위해 @DiscriminatorValue 어노테이션을 사용합니다.
@Entity
@DiscriminatorValue("자식1")
public class 자식클래스1 extends 부모클래스 {
// 자식 엔티티 1의 속성과 메서드 정의
}
상속 관계 쿼리
JPA에서는 상속 관계를 쿼리할 때 다양한 방법을 제공합니다. 예를 들어, JPQL(Java Persistence Query Language)을 사용하여 부모 엔티티와 자식 엔티티를 함께 조회할 수 있습니다.
TypedQuery<부모클래스> query = entityManager.createQuery("SELECT p FROM 부모클래스 p", 부모클래스.class);
List<부모클래스> 결과 = query.getResultList();
MappedSuperclass
@MappedSuperclass 어노테이션은 일반적인 엔티티가 아닌 공통 매핑 정보를 가진 부모 클래스로 사용됩니다.
즉, 이 어노테이션이 적용된 클래스는 실제 데이터베이스 테이블과 매핑되지 않고, 매핑 정보를 상속하기 위한 용도로만 사용됩니다.
부모 클래스에 공통적인 매핑 정보를 정의하고, 이를 상속받는 자식 클래스에서 확장하거나 재사용할 수 있습니다.
@MappedSuperclass 예제
@MappedSuperclass
public class BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "created_at")
private LocalDateTime createdAt;
@Column(name = "updated_at")
private LocalDateTime updatedAt;
// Getter와 Setter 메서드
}
@Entity
@Table(name = "사용자")
public class 사용자 extends BaseEntity {
@Column(name = "사용자_이름")
private String 이름;
// 다른 사용자 속성들
}
@Entity
@Table(name = "제품")
public class 제품 extends BaseEntity {
@Column(name = "제품_이름")
private String 이름;
// 다른 제품 속성들
}
@MappedSuperclass와 상속 전략 연관.
@MappedSuperclass 어노테이션은 상속 전략과 함께 사용되어 공통 매핑 정보를 부모 클래스에서 정의하고, 다양한 상속 전략(단일 테이블 전략 또는 조인 테이블 전략)을 자식 클래스에서 선택적으로 적용할 수 있습니다.
예제에서 BaseEntity 클래스는 @MappedSuperclass 어노테이션을 사용하여 공통 매핑 정보를 정의하고, 이 클래스를 상속받는 사용자 및 제품 엔티티는 상속 전략을 선택하여 부모 클래스의 매핑 정보를 상속하면서 각자의 테이블에 매핑됩니다. 주로 ( 작성자, 작성일, 수정자, 수정일 ) 같은 중복되는 내용들을 정의하여 관리할 수 있습니다.
'컴퓨터 언어 > Java' 카테고리의 다른 글
JPA - 값 타입 사용 방법 (0) | 2023.09.11 |
---|---|
JPA - Proxy(프록시) 이해하기 (0) | 2023.09.07 |
JPA - 연관관계 (0) | 2023.09.01 |
JPA - 영속성 (0) | 2023.09.01 |
JPA - 주요 엔티티 12가지 (0) | 2023.08.29 |