Entity Mapping
이번 챕터에서는 엔티티와 테이블을 정확하게 매핑하는데 사용되는 어노테이션들에 대해서 소개합니다.
- 객체와 테이블 매핑 : @Entity, @Table
- 기본 키 매핑 : @Id
- 필드와 컬럼 매핑 : @Column
- 연관관계 매핑 : @ManyToOne, @JoinColumn ..etc.
@Entity
테이블과 매핑할 클래스는 필수적으로 @Entity 어노테이션을 붙여주어야 합니다.
주의사항
기본 생성자는 필수입니다.
자바에서 생성자를 하나도 설정하지 않으면 기본적으로 인자가 없는 기본 생성자를 생성해줍니다. 다만 기본 생성자가 아닌 생성자가 하나라도 있을 경우 자동으로 생성해주지 않기 때문에 이때는 기본 생성자도 생성해 주어야합니다
final, enum, interface, inner 클래스에는 사용할 수 없습니다.
저장할 필드에 final을 사용하면 안 됩니다.
@Table
@entity어노테이션과 반대로 엔티티와 매핑할 ‘테이블’을 지정해줍니다.
@Id
DB마다 제공하는 기본 키 생성 방식은 다릅니다. 이러한 문제를 해결하기위해 JPA는 어떤 방식을 사용했을까요 ?
JPA가 제공하는 기본 키 생성 전략은 다음과 같습니다.
직접 할당 : 어플리케이션에서 직접 할당합니다.
자동 생성 :
IDENTITY : 기본 키 생성을 디비에 위임합니다.
해당 생성 전략은 엔티티를 데이터베이스에 저장해야 식별자를 구할 수 있으므로 persist()메소드가 호출되는 즉시 INSERT SQL이 데이터베이스에 전달됩니다. 따라서 트랜잭션을 지원하는 쓰기 지연이 동작하지 않습니다.
SEQUENCE : 디비 시퀀스를 사용해서 기본 키를 할당합니다.
sequence는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트입니다. 이 시퀀스를 활용해 기본 키를 생성하며 시퀀스를 지원하는 디비에서만 사용이 가능합니다.
TABLE : 키 생성 테이블을 사용합니다.
키 생성 전용 테이블을 하나 만들고 여기에 이름과 값으로 사용할 컬럼을 만들어 디비 시퀀스를 흉내내는 전략입니다. 이 전략은 테이블을 사용하므로 모든 디비에 적용이 가능합니다.
AUTO : 사용하는 데이터베이스 방언에 따라 위의 전략 중 하나를 자동으로 선택하게끔 하는 전략입니다. mysql을 사용하면 IDENTITY를 oraqle을 선택하면 SEQUENCE를 사용합니다.
영속성 컨텍스트는 엔티티를 식별자 값으로 구분하므로 엔티티를 영속 상태로 만들기위해서는 식별자 값이 반드시 필요합니다.
엔티티 필드 ↔ 테이블 컬럼 매핑 어노테이션
Column, Enumerated, Temporal, Lob, Transient, Access