JPA를 사용하면서 Entity와 Table 매핑은 가장 중요함
Mapping Annotation을 지원하는데, 크게 4가지로 나뉨
객체와 테이블 매핑 : @Entity, @Table
기본키 매핑 : @Id
필드와 컬럼 매핑 : @Column
연관관계 매핑 : @ManyToOne, @JoinColumn
@Entity를 사용해서 매핑할 클래스를 지정
JPA가 관리
기본 생성자 필수
final 클래스, enum, interface, inner 클래스 사용 X
속성
Entity와 매핑할 Table 지정
생략하면 매핑한 Entity 이름을 Table 명으로 사용
속성
name : 매핑할 Table 이름 (기본값은 Entity 명)
catalog : catalog 기능이 있는 데이터베이스에서 catalog 매핑
schema : schema 기능이 잇는 데이터베이스에서 schema를 매핑
기본적으로 @Id 어노테이션만 사용하면, 기본키를 어플리케이션에서 직접 할당
@GeneratedValue(strategy = GenerationType.타입) 을 통해서 기본키 생성 전략 변경 가능하며, 기본값은 데이터베이스마다 자동으로 선택되는 AUTO
키 생성 전략이 다양한 이유는 데이터베이스 벤더마다 지원하는 방식이 다르기 때문
IDENTITY
기본키 생성을 데이터베이스에 위임
AUTO_INCREMENT
이 전략을 사용하려면 데이터베이스로부터 기본 키값을 얻어오기 위해 추가 조회 발생
무조건 INSERT를 한 후에 조회 가능 => 쓰기 지연 동작 X
JDBC3에 추가된 Statement.getGeneratedKeys()를 사용하면 데이터 저장과 동시에 생성된 기본 키값도 얻어올 수 있음
Hibernate는 이것을 이용해서 한번만 통신
SEQUENCE
데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 데이터베이스 오브젝트
이 시퀀스를 사용해서 기본 키 생성
시퀸스 생성 1 : CREATE SEQUENCE "시퀀스 명" START WITH 1 INCREENT BY 1;
시퀀스 생성 2 : @SequenceGenerator 사용
@SequenceGenerator(
name = "Generator 명",
sequenceName = "매핑할 데이터베이스 시퀀스 명",
initialValue = 1, allocationSize = 1
)
GeneratedValue 속성에
@GeneratedValue(
strategy = "GenerationType.SEQUENCE,
generator = "Generator 명"
)
IDENTITY와 달리, persist를 호출하면 먼저 데이터베이스 시퀀스를 사용해서 식별자 조회
조회한 식별자를 찾아서 Entity에 할당한 후에 Entity를 영속성 컨텍스트에 저장
TABLE
키 생성 전용 Table을 하나 만들고 이름과 값으로 사용할 컬럼을 만들어 데이터베이스 시퀀스를 흉내내는 전략
Table을 사용하기 때문에 모든 데이터베이스에서 사용 가능
@TableGenerator(
name = "Generator 명",
table = "테이블 명"
pkColumnValue = "Key로 사용할 column명",
allocationSize = "증가 값"
)
GeneratedValue 속성에
@GeneratedValue(
strategy = GenerationType.TABLE,
generator = "Generator 명"
)
객체 필드를 컬럼에 매핑
가장 많이 사용되는 속성으로 name, nullable 이 있음
속성
name : 필드와 매핑할 테이블의 컬럼 이름 (기본값은 필드명)
nullable : null 값의 사용 여부를 설정 (기본값은 true)
unique : @Table의 uniqueConstraints와 같지만, 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용
두 컬럼 이상을 사용해서 유니크 제약조건을 걸 때는 Table.uniqueConstraints를 사용
length : 문자 길이 제약조건, String 에서만 사용
precision : 소숫점을 포함한 전체 자릿수
scale : 소수의 자릿수
BigDemical 타입에서 사용, precision과 scale은 float, double 타입에는 적용이 안되며, 아주 큰 숫자나 정밀한 소수를 다뤄야할 때 사용
속성
EnumType.STRING : enum 이름을 그대로 저장, 데이터 크기가 ORDINAL에 비해 크지만, enum 순서 변경 가능
EnumType.ORDINAL : enum을 순서대로 숫자로 저장, 데이터 크기가 작은 대신 순서 변경 X
속성
필수로 지정해야함
TemporalType.DATE
TemporalType.TIME
TemporalType.TIMESTAMP
매핑 하지 않음을 의미
데이터베이스에 저장, 조회하지 않고 임시적으로 어떤 겂을 보관하고 싶을 때 사용
JPA 가 Entity 데이터에 접근하는 방식을 지정
설정하지 않으면 @Id의 위치를 기준으로 접근 방식이 결정
@Id 가 필드에 있으면 필드 접근, 프로퍼티 위에 있으면 프로퍼티 접근
속성
AccessType.FIELD
AccessType.PROPERTY