✅ @DiscriminatorColumn ✅ @DiscriminatorValue("")
관계형 데이터베이스는 상속 관계가 없지만, 객체 상속과 유사한 슈퍼타입 서브타입 관계를 이용한다.
객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑
- @Inheritance(strategy = InheritanceType.JOINED)
- 거의 이걸 씀
- ALBUM, MOVIE, BOOK 그리고 공통된 속성을 담은 ITEM으로 각각 테이블로 변환한 뒤, DTYPE에 따라 필요한 테이블끼리 조인한다.
@Entity
@Inheritance(strategy = InheritanceType.JOINED) // 매핑 전략 지정
@DiscriminatorColumn // DTYPE
public class Item {
@Id
@GeneratedValue
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;
}
@Entity
public class Book extends Item{
private String author;
private String isbn;
}
- @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
- 정말 간단할 경우에 사용
- ITEM 테이블 하나에 필요한 모든 속성을 담아 통합 테이블(단일 테이블)로 변환한다.
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) // 매핑 전략 지정
@DiscriminatorColumn // DTYPE
public class Item {
@Id
@GeneratedValue
private Long id;
private String name;
private int price;
public Long getId() {
return id;
}
}
- @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
- 거의 안씀
- 각 테이블 마다 공통된 속석인 NAME, PRICE을 각각 가지고 있는다.
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) // 매핑 전략 지정
@DiscriminatorColumn // DTYPE
public abstract class Item {
@Id
@GeneratedValue
private Long id;
private String name;
private int price;
public Long getId() {
return id;
}
}
h2 데이터베이스 1.4.200에서 발생하는 문제이다.
하이버네이트 5.4.13.Final 부터 H2 데이터베이스 1.4.200을 제대로 지원한다.
drop 테이블 이슈도 해결됨
https://www.inflearn.com/questions/52796
pom.xml의 dependencies 태그 안에
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
넣고 xml 새로고침 한뒤에
File -> Settings -> Build, Execution, Deployment -> Java Compiler 순으로 타고 들어가서
Java Compiler 내용들 중 Project bytecode version과 Per-module bytecode version 속 저희 프로젝트 이름 모듈의 Target bytecode version의 값을 둘다 8로 바꿔줌