[JPA] 상속관계 매핑
- 어떤 전략을 사용하든 상위 타입은 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