자바/JPA
JPA 고급 매핑
OverTheHorizon3410
2023. 11. 4. 20:11
- 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;
}

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