728x90
- 통합 테이블로 변환하는 단일 테이블 전략(SINGLE_TABLE)
- 서비스 규모가 크지 않고, 굳이 조인 전략을 선택해서 복잡하게 갈 필요가 없다고 판단 될 때에는 한 테이블에 다 저장하고, DTYPE으로 구분하는 단일 테이블 전략을 선택할 수 있다.
- INSERT 쿼리도 한 번, SELECT 쿼리도 한 번이다. 조인할 필요가 없고, 성능이 좋다.
- 단일 테이블 적용
- 아래와 같이, strategy를 SINGLE_TABLE로 변경하면 끝난다.
- JPA의 장점이다. 테이블 구조의 변동이 일어났는데, 코드를 거의 손대지 않고 어노테이션만 수정했다.
- 만약 JPA를 쓰지 않았더라면, 테이블 구조의 변경이 일어나면 거의 모든 코드를 손대야 할 것이다.
- 단일 테이블 전략에서는 @DiscriminatorColumn을 선언해 주지 않아도, 기본으로 DTYPE 컬럼이 생성된다.
- 한 테이블에 모든 컬럼을 저장하기 때문에, DTYPE 없이는 테이블을 판단할 수 없다.
- 아래와 같이, strategy를 SINGLE_TABLE로 변경하면 끝난다.
@Entity
@DiscriminatorColumn
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Item {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private int price;
}
- 실행된 DDL
- 통합 테이블이 하나 생성된다.
Hibernate: create table Item ( DTYPE varchar(31) not null, id bigint generated by default as identity, name varchar(255), price integer not null, artist varchar(255), author varchar(255), isbn varchar(255), actor varchar(255), director varchar(255), primary key (id) )
- 조인 전략에서 실습했던 Movie 저장, 조회 예제를 그대로 돌려보면?
- Item 테이블을 그냥 조회한다. 조인하지 않고, DTYPE을 검색 조건으로 추가해서 Movie를 조회
- @DiscriminatorColumn(DTYPE)인 Movie를 기준으로 한 테이블에 item 정보를 조회할 수 있다.
Hibernate:
select
movie0_.id as id2_0_0_,
movie0_.name as name3_0_0_,
movie0_.price as price4_0_0_,
movie0_.actor as actor8_0_0_,
movie0_.director as director9_0_0_
from
Item movie0_
where
movie0_.id=?
and movie0_.DTYPE='Movie'
728x90
'JPA' 카테고리의 다른 글
고아 객체(feat. orphanRemoval) (0) | 2022.06.12 |
---|---|
영속성 전이에 관해(부제 : CASCADE) (0) | 2022.06.11 |
(JPA) Error attempting to apply AttributeConverter 에러 관련 글(feat. @Converter 사용시) (0) | 2022.03.26 |
JPA에서 pageable을 통해 Paging 간단하게 구현하는 법 (0) | 2022.03.22 |
(스프링 시큐리티)UserDetailsService, UserDetail (0) | 2022.02.17 |