객체지향 언어를 사용해본 사람이라면 당연히 상속 관계에 대해 알고있을것이다.
그렇다면 관계형 데이터 베이스에는 상속 관계가 있을까?
이에 대한 답은 "없다" 이다. 그렇다면 어떻게 상속 관계를 DB에 표현 할 수 있을까?
💁 이는 슈퍼 타입, 서브 타입 관계와 가장 유사하다고 볼 수 있다.
엔티티 각각을 모두 테이블로 만들고 부모 테이블의 키를 받아 기본키 + 외래키 ( 복합키로 ) 사용
→ 조회시 조인 전략 사용
‼️주의점
객체는 타입이 있지만 테이블은 타입이 없다. 따라서 따로 DTYPE 컬럼을 구분 컬럼으로 사용
@Inheritance(strategy = InheritanceType.JOINED) : 상속 매핑은 부모 클래스에 Inheritance를 사용해야 하며 조인 전략이기 때문에 JOINED를 선택
@DiscriminatorColumn(name = "DTYPE") : 부모 클래스에 구분 컬럼을 지정
이름 그대로 테이블을 하나만 사용한다. (즉 하나에 다 때려박음)
조회 성능은 가장 뛰어남
‼️ 주의점
자식 엔티티가 매핑한 컬럼은 모두 Null 허용
일반적으로 추천하지 않는다 (나는 객체지향적이지 못하다 생각함)
이전에는 부모 클래스, 자식클래스를 모두 데이터 베이스 테이블과 매핑 했지만 이 어노테이션을 사용한다면 그렇지 않다.
부모 클래스는 테이블에 매핑하지 않고 부모 클래스에게 상속을 받는 자식 클래스에게만 매핑을 제공하게 된다.
→ 추상 클래스와 비슷 (abstract)
위와 같이 객체 기준으로 중복되는 필드 값이 있는경우 이를 묶어 baseEntity를 작성하게 된다.
부모로 부터 물려받은 매핑 정보를 재정의 하고 싶다면 @AttributeOverride를 사용
연관관계를 재정의 하고 싶다면 @AssociationOverrides를 사용하면 된다.
‼️ 주의점
부모 클래스는 당연히 em.find가 불가능
외래키가 기본키에 포함되는지에 따라 식별/ 비식별로 나뉘게 된다.
외래키 + 기본키가 식별자 이다 ⇒ 식별
외래키 / 기본키 (기본키만 식별자 ) ⇒ 비식별
‼️ 식별자가 2개인 경우에는 동등성 비교시 equals와 hashcode를 따로 구현 해야함