JPA 고급 매핑

  • JPA 조인 전략
package com.example.springboot3.test;

import jakarta.persistence.*;
import lombok.Getter;

@Entity
@Getter
@Inheritance(strategy = InheritanceType.JOINED) // 상속 매핑은 부모 클래스에 선언
@DiscriminatorColumn(name = "DTYPE") // 부모 클래스에 구분 컬럼을 지정
public class Item {
    
    @Id
    @GeneratedValue
    @Column(name = "ITEM_ID")
    private Long id;
    private String name;
    private int price;
}

@Entity
@DiscriminatorValue("A") // 구분 컬럼에 입력할 값을 지정
@Getter
class Album extends Item {
    
    private String artist;
    private String etc;
}

@Entity
@DiscriminatorValue("M") // 구분 컬럼에 입력할 값을 지정
@PrimaryKeyJoinColumn(name = "MOVIE_ID") // 부모 테이블의 기본 키 컬럼명을 변경
@Getter
class Movie extends Item {
    
    private String director;
    private String actor;
}

조인전략에서 테이블 구조

  1. ITEM
    @Entity
    @Getter
    @Inheritance(strategy = InheritanceType.JOINED) // 상속 매핑은 부모 클래스에 선언
    @DiscriminatorColumn(name = "DTYPE") // 부모 클래스에 구분 컬럼을 지정
    public class Item {
        
        @Id
        @GeneratedValue
        @Column(name = "ITEM_ID")
        private Long id;
        private String name;
        private int price;
    }
    1. 나머지는 일반 엔티티 설정과 동일하다.
    1. @Inheritance(strategy = InheritanceType.JOINED)
      • 조인을 상속 매핑의 기본 전략으로 삼는다.
      • 서브 클래스는 모두 테이블이 생성된다.
    1. @DiscriminatorColumn(name=”DTYPE”)
      • 구분자가 dtype 으로 들어가게된다.
  1. Album
    @Entity
    @DiscriminatorValue("A") // 구분 컬럼에 입력할 값을 지정
    @Getter
    class Album extends Item {
        
        private String artist;
        private String etc;
    }
    1. @DiscriminatorValue("A")
      • 슈퍼 클래스의 구분자에 “A”라는 값으로 입력된다.
  1. Movie
    @Entity
    @DiscriminatorValue("M") // 구분 컬럼에 입력할 값을 지정
    @PrimaryKeyJoinColumn(name = "MOVIE_ID") // 부모 테이블의 기본 키 컬럼명을 변경
    @Getter
    class Movie extends Item {
        
        private String director;
        private String actor;
    }
    1. @PrimaryKeyJoinColumn(name = "MOVIE_ID")
      • PK이자 FK 의 값이 MOVIE_ID 의 컬럼이름으로 설정됩니다.

@MappedSuperclass

  • 부모 클래스는 테이블 매핑 X
  • 부모 클래스 상속받는 자식 클래스 매핑정보만 제공
@MappedSuperclass
public class BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
}

@Entity
class Member extends BaseEntity {
    private String email;
}

@Entity
class Seller extends BaseEntity {
    private String shopName;
}
  • 보통 @MappedSuperclass 의 경우에는 추상클래스 선언하여 사용 → 직접 생성해서 사용할 일이 없기때문
  • @MappedSuperclass는 영속화 X → em.find || JPQL 사용불가


Uploaded by N2T