JPA - 상속관계 매핑
상속관계 매핑
관계형 데이터베이스에는 상속이라는 개념이없다.
슈퍼타입과 서브타입 관계라는 모델링 기법이 객체의 상속과 가장 유사하다.
상속관계 매핑은 객체의 상속과 DB의 슈퍼타입 서브타입 관계를 매핑하는것이다.
슈퍼타입 서브타입 논리 모델을 실제 물리모델로 구현하는 방법은 3가지가 있다.
- 조인전략 : 각각 테이블로 변환
- 단일 테이블전략 : 통합 테이블로 변환
- 구현 클래스마다 테이블 전략 : 구현 클래스마다 테이블 전략
주요 어노테이션
- @Inheritance(strategy=InheritanceType.XXX)
- JOINED : 조인 전략
- SINGLE_TABLE : 단일 테이블 전략
- TABLE_PER_CLASS : 구현 클래스마다 테이블 전략
- @DiscriminatorColumn(name=“DTYPE”) : 부모 클래스에 선언한다 하위클래스를 구분하는 컬럼
- @DiscriminatorValue(“XXX”) : 하위클래스에 선언한다. 앤티티에 저장할때 슈퍼타입의 구분 컬럼에 저장할 값을 지정한다. 디폴트는 클래스 이름
조인 전략
- 장점
- 테이블 정규화
- 외래 키 참조 무결성 제약조건 활용가능
- 저장공간 효율화
- 단점
- 조회시 조인을 많이 사용, 성능 저하
- 조회시 쿼리가 복잡함
- 데이터 저장시 insert SQL이 2번 호출
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn // 조인전략어 없어도 되긴하지만 명시적으로 넣는걸 추천한다.
public class Item {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private int price;
}
@Entity
public class Album extends Item {
private String artist;
}
@Entity
public class Movie extends Item {
private String director;
private String actor;
}
// Book class 등등
단일 테이블 전략
- 장점
- 조인이 필요 없다. 조회성능이 빨라지는 효과가 있다.
- 조회 쿼리가 단순해진다.
- 단점
- 자식엔티티가 매핑한 컬럼은 모두 null 허용
- 단일 테이블에 모든 것을 저장하므로 테이블이 커질수있다. 성능 저하의 우려가 있다.
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn // 싱글테이블전략의 경우 한 테이블에 전부 저장하기때문에 필수이다.
public class Item {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private int price;
}
@Entity
public class Album extends Item {
private String artist;
}
@Entity
public class Movie extends Item {
private String director;
private String actor;
}
구현 클래스마다 테이블 전략
- 이 전략은 DB설계측면과 객체 측면에서 둘다 추천하지않는다
- 장점
- 서브 타입은 명확하게 구분해서 처리할 때 효과적
- not null 제약조건 사용 가능
- 단점
- 여러 자식 테이블을 함께 조회할때 성능이 느림(UNION SQL 필요)
- 자식 테이블을 통합해서 쿼라하기 어려움
댓글남기기