[JPA] 고급매핑
1. 상속관계 매핑
- 관계형 DB는 상속 관계 못함.
- 실제 물리 모델로 구현하는 방법
- 조인전략
- 단일 테이블 전략
- 구현 클래스마다 테이블 전략 (추천하지않음)
- 주요 어노테이션
- @Inheritance(strategy = InheritanceType.XXX)
- JOINED : 조인전략
- SINGLE_TABLE : 단일 테이블 전략
- TABLE_PER_CLASS : 구현 클래스마다 테이블 전략
- @DiscriminatorColumn(name = “dtype”)
- 조인할 때 하위 테이블의 이름들을 dtype이라는 컬럼에 넣는다.
- dtype은 다른 컬럼 명으로 바꿀 수 있다.
- 이 어노테이션을 안 쓸 때 DTYPE 이 default 값이다.
- @DiscriminatorValue(“A”)
- 2번에서 dtype 컬럼 안에 넣어지는 테이블 이름을 바꾸는 것이다.
- A 말고 다른 걸로 바꿀 수 있다.
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "dtype")
@Getter @Setter
public abstract class Item {
//abstract : 추상클래스를 적용하면 Item 테이블이 만들어지지 않는다.
//Item 테이블을 만들고 싶으면 astract을 빼라.
@Id
@GeneratedValue
@Column(name = "item_id")
private Long id;
private String name;
private int price;
}
여기서 item 테이블을 실제로 조회하면 컬럼은 4개가 나온다.
id, name, price 그리고 dtype
@Entity
@Getter
@Setter
@DiscriminatorValue("A")
public class Album extends Item {
private String artist;
private String etc;
}
Album 테이블에 값이 넣어질 때, item 테이블의 dtype컬럼에 Album이라는 값이 들어가는게 아니라 A가 들어간다.
2. @MappedSuperclass
- 공통 매핑 정보가 필요할 때 사용한다.
- 예를 들어, 두 테이블에 id, name이 공통으로 들어갈 때 사용하는 것이다.
- 추상클래스로 만드는 것을 권장.
- 주로, 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통으로 적용하는 정보를 모을 때 사용한다.
@Entity
public class Member extends BaseEntity{
@Id
@GeneratedValue
@Column(name = "item_id")
private Long id;
private String name;
}
@MappedSuperclass
public abstract class BaseEntity{
private String createdBy;
private LocalDateTime createdDate;
}
본 포스팅은 김영한 선생님의 강의를 보고 정리한 글입니다.
Comments