객체 세상에서는 상속관계가 있다. 그리고 이와 유사하게 데이터베이스에서는 슈퍼타입과 서브 타입의 개념이 있다. jpa는 이러한 상황속에서 객체와 디비와 연결해주기 위해서 편리한 애노테이션을 제공한다. 바로 @Inheritance(strategy=InheritanceType.XXX)
이다. 해당 어노테이션을 부모에 해당하는 객체에 지정을 하고 원하는 전략을 선택해주면 된다.
처음 소개할 상속 전략은 Join이다. 코드는 다음과 같이 작성해주면 된다.
//Item.class
@Entity
@Inheritance(strategy = InheritanceType.JOINED) //요기
@DiscriminatorColumn()
public class Item {
@Id @GeneratedValue
@Column(name = "item_id")
private Long id;
private String name;
private int price;
}
//Movie.class
@Entity
public class Movie extends Item {
private String director;
private String actor;
}
@DiscriminatorColumn()
는 Dtype 이다.@Inheritance(strategy = InheritanceType.JOINED)
을 통해 Join 전략을 활용할 수 있으며 결과는 아래 그림과 같은 테이블이 생성된다.//main.class
Movie movie = new Movie();
movie.setActor("actor");
movie.setDirector("dir");
movie.setName("바람과 함께 사라지리라");
movie.setPrice(10000);
em.persist(movie);
참고로 Dtype을 클래스 명이 아니라 다르게 지정하고 싶다면 자식 클래스에서
@DiscriminatorValue("무비")
로 수정해주면 된다.
만약에 프로젝트의 규모가 크지 않다면 싱글 전략을 고려해볼 수 있다. 이는 하나의 테이블에 모든 값들을 넣는 것이라고 생각하면 된다. (아래 그림을 참고하자)
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) //요기 수정
@DiscriminatorColumn()
public class Item {
...
}