소소한개발팁
article thumbnail
반응형

상속 관계의 종류

단일 테이블 전략 (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
profile

소소한개발팁

@개발자 뱅

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!