- 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
'자바 > JPA' 카테고리의 다른 글
[JPA] 지연 로딩과 프록시의 활용 (0) | 2023.11.04 |
---|---|
[JPA] 지연 로딩과 즉시 로딩 .. 무엇을 사용해야하나 (0) | 2023.11.04 |
[4단원] DDL 생성 기능 (0) | 2023.11.04 |
[6단원] 주 테이블에 외래키 (0) | 2023.11.04 |
[6단원] 다대다 : 연결 엔티티 사용 (0) | 2023.11.04 |