김영한님의 <자바 ORM 표준 JPA 프로그래밍> 책을 정리한 내용입니다.
슈퍼타입 서브타입 논리 모델을 실제 물리 모델인 테이블로 구현할 때는 3가지 방법을 선택할 수 있다.
- 조인 전략: 각각의 테이블로 변환
- 단일 테이블 전략: 통합 테이블로 변환
- 구현 클래스마다 테이블 전략: 서브타입 테이블로 변환
상속 관계를 매핑할 때는 @Inheritance 어노테이션을 사용하고 속성으로 취하려는 전략을 명시해준다.
엔티티 각각을 모두 테이블로 만들고 자식 테이블이 부모 테이블의 기본 키를 받아서 기본 키 + 외래 키로 사용하는 전략이다.
이 전략을 사용할 때 주의할 점은 객체는 타입으로 구분할 수 있지만 테이블은 타입의 개념이 없으므로 타입을 구분하는 컬럼(DTYPE)을 추가해야 한다.
장점
단점
이름 그대로 테이블을 하나만 사용한다.
구분 컬럼(DTYPE)으로 어떤 자식 데이터가 저장되었는지 구분한다.
이 전략을 사용할 때 주의점은 자식 엔티티가 매핑한 컬럼은 모두 null을 허용해야 한다는 점이다.
InheritanceType.SINGLE_TABLE로 전략을 사용한다.
장점
단점
자식 엔티티마다 테이블을 만든다.
자식 테이블에 각각 필요한 컬럼이 모두 있는 형태다.
InhritanceType.TABLE_PER_CLASS를 선택하여 전략을 사용한다.
장점
단점
테이블과 매핑되지 않고 자식 클래스에 엔티티의 매핑 정보를 상속하기 위해 사용한다.
등록일, 수정일 같이 여러 엔티티에서 공통으로 사용하는 매핑 정보만 상속받고 싶을 때 사용하는 기능이다.
부모로부터 물려받은 매핑 정보를 재정의하려면 @AttributeOverrides나 @AttributeOverride를 사용하면 된다.
이 클래스를 직접 생성해서 사용할 일은 거의 없으므로 추상 클래스로 만드는 것이 좋다.
데이터베이스의 식별자가 하나 이상일 때 매핑하는 방법
- 식별 관계(Identifying Relationship): 부모 테이블의 기본 키를 내려받아서 자식 테이블의 기본 키 + 외래 키로 사용하는 관계
- 비식별 관계(Non-Identifying Relationship): 부모 테이블의 기본 키를 받아서 자식 테이블의 외래 키로만 사용하는 관계
복합 키
JPA는 복합 키를 지원하기 위해 @IdClass와 @EmbeddedId 2가지 방법을 제공한다.
데이터베이스에서 테이블은 외래 키 하나로 연관관계를 맺을 수 있지만 연관관계를 관리하는 연결 테이블을 두는 방법도 있다.
보통 엔티티 하나에 테이블 하나를 매핑하지만 엔티티 하나에 여러 테이블을 매핑하는 방법도 있다.
@SecondaryTable 어노테이션을 사용하여 매핑하면 된다.