서하빈 2023. 11. 27. 15:12

- 어떤 전략을 사용하든 상위 타입은 abstract 클래스로 만드는 것이 좋다.(하위 타입 없이 상위 타입만 생성하는 경우는 없기 때문)

- 추상 클래스는 생성자를 가질 수 있다.(하위 타입에서 호출함으로써 인스턴스 필드를 초기화 하는 과정이 필요할 수도 있기 때문)

 

 

단일 테이블 전략 예제 코드

@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DTYPE", discriminatorType = DiscriminatorType.STRING)
public abstract class Item {
    @Id @GeneratedValue
    private Long id;
    private String name;
    private int price;
    
    public Item(String name, int price) {
    	this.name = name;
        this.price = price;
    }
}

@Getter
@Entity
@DiscriminatorValue("A")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Album extends Item {
	private String artist;
    
    @Builder
    public Album(String name, int price, String artist) {
    	super(name, price);
        this.artist = artist;
    }
}

@Getter
@Entity
@DiscriminatorValue("M")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Movie extends Item {
    private String director;
    private String actor;
    
    @Builder
    public Movie(String name, int price, String director, String actor) {
        super(name, price);
        this.director = director;
        this.actor = actor;
    }
}

@Getter
@Entity
@DiscriminatorValue("B")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Book extends Item {
    private String author;
    private String isbn;
    
    @Builder
    public Book(String name, int price, String author, String isbn) {
        super(name, price);
        this.author = author;
        this.isbn = isbn;
    }
}

- @Inheritance 자체를 생략하여도 기본적으로 JPA는 단일 테이블 전략을 사용한다.

- @DiscriminatorColumn을 생략하여도 하위 타입을 구분하는 컬럼도 자동으로 생성된다.

 

- 조인 전략이 정석이라고 생각하면 된다.

 

조인 전략 예시 코드

- 위의 단일 테이블에서 전략부분만 joined로 변경하면 된다.

 

 

- @DiscriminatorColumn을 이용하여 슈퍼타입에 하위타입을 구분하는 컬럼을 넣을 수 있다.

- @DiscriminatorValue를 이용하여 하위타입을 구분하는 컬럼에 들어가는 값을 지정할 수 있다. 기본값은 하위 타입의 엔티티명이다.

 

 

- 상위 클래스를 추상 클래스로 만들지 않으면 의도하지 않게 ITEM 테이블도 생성된다.

- @DiscriminatorColumn 해당 애너테이션은 필요가 없게 되고 적용이 안된다.

 

 

출처: 인프런 김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편

https://www.inflearn.com/course/ORM-JPA-Basic

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

초급자를 위해 준비한 [웹 개발, 백엔드] 강의입니다. JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자

www.inflearn.com