Spring/JPA

JPA 강의 5 - 고급 매핑

ummchicken 2022. 12. 19. 22:56

출처 : 자바 ORM 표준 JPA 프로그래밍 - 기본편


섹션 7. 고급 매핑

🚨 에러

WARN: HHH000457: Joined inheritance hierarchy [hellojpa.Item] defined explicit @DiscriminatorColumn.

실습을 하다 생긴 에러이다.
(제일 처음에 난 에러.
💡 에러가 날 때는 제일 먼저,
에러가 난 첫 번째 지점의 에러부터 해결한다.
첫 번째 에러 해결하면 그 뒤에 에러 줄줄이 해결 될 가능성 높음)


난 분명히

<property name="hibernate.hbm2ddl.auto" value="create" />

로 했는데, 실행할 때마다 테이블이 삭제되고 새로 생성되지 않는 것이다?
아마 삭제할 때 에러가 난 듯 하고, 값도 새로 설정이 되는 게 아니라 자꾸 추가가 되었다.
그래서 구글링...
이 질의응답 보고 해결했다!
난 JPA 활용 1 강의를 먼저 듣고 이 강의를 들어서 그런지 (역순서)
김영한쌤이랑 똑같이 환경 세팅을 해도
자바 버전이랑 하이버네이트 버전 같은 게 꼬일 때가 종종 있었다.

💡 만약, H2가 1.4.200 버전이라면
하이버네이트 버전을 5.4.13.Final 버전 이상부터 사용하면 된다고 한다.
<!-- JPA 하이버네이트 -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>5.4.13.Final</version>
</dependency>

pom.xml을 이렇게 수정하면 된다.


김영한쌤 실습은

<version>5.3.10.Final</version>

5.3.10.Final 버전이다.


++ 아 그리고 또 만약 자바 11 사용할 거면 pom.xml에

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>

이거 넣어야 에러 안 난다..!
아마 이 강의는 김영한쌤이 자바 8인가? 사용하시는데,
자바 11로 가면 지원하지 않는 기능이라나.. 그렇다고 한다.


1. 상속관계 매핑

1 - 0. 상속관계 매핑

  • 관계형 데이터베이스는 상속 관계X
  • 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사
  • 상속관계 매핑: 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑
  • 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법
    • 각각 테이블로 변환 -> 조인 전략
    • 통합 테이블로 변환 -> 단일 테이블 전략
    • 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략

1 - 1. 전략 1 : 조인 전략


1 - 2. 전략 2 : 단일 테이블 전략


1 - 3. 전략 3 : 구현 클래스마다 테이블 전략

(추천X)


1 - 4. 주요 어노테이션

  • @Inheritance(strategy=InheritanceType.XXX)
    JOINED: 조인 전략
    SINGLE_TABLE: 단일 테이블 전략 (성능 상의 이점이 있음) (@DiscriminatorColumn 없어도 됨)
    TABLE_PER_CLASS: 구현 클래스마다 테이블 전략
  • @DiscriminatorColumn(name=“DTYPE”)
  • @DiscriminatorValue(“XXX”)


2. @MappedSuperclass

2 - 1. 공통 매핑 정보가 필요할 때 사용

(id, name)

  • 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공
  • 조회, 검색 불가(em.find(BaseEntity) 불가)
  • 직접 생성해서 사용할 일이 없으므로 추상 클래스 권장