Item 엔티티
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminateColumn
public abstract class Item {
@Id @GeneratedValue
private Long id;
private String name;
private int price;
}
movie 엔티티 (Item 엔티티를 상속받는다)
@Entity
public class Movie extends Item {
private String director;
private String actor;
}
JpaMain
Movie movie = new Movie();
movie.setDirector("aaaa");
movie.setActor("bbbb");
movie.setName("바람과함께사라지다");
movie.setPrice(10000);
em.flush();
em.clear();
Movie findMovie = em.find(Movie.class, movie.getId());
System.out.println("findMovie = " fineMovie);
tx.commit();
Movie 엔티티 생성 후 em.flush()
를 이용해 Query를 날리고 em.clear()
를 통해 영속성 컨텍스트를 초기화한다.
이 후, 엔티티 조회 시 inner join Query
가 나간다.
Hibernate:
select
movie0_.id as id1_2_0_,
movie0_1_.name as name2_2_0_,
movie0_1_.price as price3_2_0_,
movie0_.actor as actor1_6_0_,
movie0_.director as director2_6_0_
from
Movie movie0_
inner join
Item movie0_1_
on movie0_.id=movie0_1_.id
where
movie0_.id=?
findMovie = hello.jpa.Movie@534ca02b
null
이 허용된다.Item 엔티티
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminateColumn
public abstract class Item {
@Id @GeneratedValue
private Long id;
private String name;
private int price;
}
ITEM
테이블에 합쳐지고 자식 테이블은 생성되지 않는다.@DiscriminateColumn
어노테이션을 달지 않아도 DTYPE이 기본적으로 생성된다.@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@DiscriminateColumn
public abstract class Item {
@Id @GeneratedValue
private Long id;
private String name;
private int price;
}
JPA가 알아서 단일 테이블로 조회한다.
DTYPE이 필요 없으므로 @DiscriminatorColumn
어노테이션을 달아도 적용되지 않는다.
JPA 덕분에 DB 설계가 바뀌어도 코드는 손대지 않고 애너테이션의 전략만 바꾸면 해결된다.
기본적으로 조인 전략을 선택하고, 테이블이 정말 단순하고 확장할 가능성이 없다면 단일 테이블 전략을 선택한다.
비즈니스적으로 중요하고 복잡하면 조인 전략을 선택한다.
참고 :
김영한. 『자바 ORM 표준 JPA 프로그래밍』. 에이콘, 2015.