객체의 상속과 DB의 슈퍼타입,서브타입 관계를 매핑한다
Movie movie=new Movie();
movie.setDirector("aaa");
movie.setActor("BBB");
movie.setName("바람과 함께 사라지다");
movie.setPrice(10000);
em.persist(movie);
em.flush();
em.clear();
Movie findMovie=em.find(Movie.class,movie.getId());
System.out.println("findMovie="+ findMovie);
tx.commit();
전략 1)조인전략: Insert 쿼리가 2번 나간다. PK,FK로 조인전략->이걸 정석으로 생각한다.
또한 em.find로 찾아올 때는
join을 사용해서 가지고 온다.
전략 2)단일 테이블 전략: 성능이 좋다. 칼럼을 다 떄려박는다
위처럼 insert 쿼리가 Item 하나에만 나가고 ,
em.find 할때는
Dtype으로 찾기 때문에 DiscriminatorColumn을 쓰지 않고 싶어도 쓸수 밖에 없다.
전략 3) 구현 클래스마다 테이블 전략: 쓰지말자. 부모 클래스를 em.find (em.find(Item.class,Item.getId()))로 찾을떄 다 뒤지기 때문에 비효율적이다
<item으로 찾아올때 나오는 쿼리>
select
item0_.id as id1_2_0_,
item0_.name as name2_2_0_,
item0_.price as price3_2_0_,
item0_.artist as artist1_0_0_,
item0_.actor as actor1_7_0_,
item0_.director as director2_7_0_,
item0_.author as author1_1_0_,
item0_.isbn as isbn2_1_0_,
item0_.clazz_ as clazz_0_
from
( select
id,
name,
price,
artist,
null as actor,
null as director,
null as author,
null as isbn,
1 as clazz_
from
Album
union
all select
id,
name,
price,
null as artist,
actor,
director,
null as author,
null as isbn,
2 as clazz_
from
Movie
union
all select
id,
name,
price,
null as artist,
null as actor,
null as director,
author,
isbn,
3 as clazz_
from
Book
) item0_
where
item0_.id=?
@DiscriminatorColumn(name="DTYPE")으로 타입 구분 가능하다