데이터베이스 테이블의 기본 키(PK)와 객체의 필드를 매핑시켜주는 어노테이션입니다.
적용 가능 타입
자바 기본형 (int, long, ...)
자바 래퍼형 (Integer, Long, ...)
String
Date (java.util)
Date (java.sql)
BigDecimal
BigInteger
@Id만 사용할 경우 기본 키를 직접 할당해 주어야 합니다.
기본 키를 직접 할당하는 대신 데이터베이스가 생성해주는 값을 사용하려면 @GeneratedValue를 사용해주면 됩니다.
기본 키를 자동 생성해주는 어노테이션입니다.
자동 생성 전략 4가지
@GeneratedValue(strategy = GenerationType.IDENTITY)
IDENTITY 전략은 기본 키 생성을 데이터베이스에 위임하는 전략입니다.
주로 MySQL, PostgreSQL, SQL Server에서 사용합니다.
예를 들어 MySQL의 AUTO_INCREMENT 기능은 데이터베이스가 기본 키를 자동으로 생성해줍니다.
IDENTITY 전략은 AUTO_INCREMENT처럼 데이터베이스에 값을 저장하고 나서야 기본 키 값을 구할 수 있을 때 사용합니다.
주의점
엔티티가 영속 상태가 되기 위해서는 식별자가 필수입니다.
그런데 IDENTITY 전략을 사용하면 식별자를 데이터베이스에서 지정하기 전까지는 알 수 없기 때문에, em.persist()를 하는 즉시 INSERT SQL이 데이터베이스에 전달됩니다.
따라서 이 전략은 트랜잭션을 지원하는 쓰기 지연이 동작하지 않습니다.
SEQUENCE
데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트입니다. SEQUENCE 전략은 이 시퀀스를 사용해서 기본 키를 생성합니다.
이 전략은 시퀀스를 지원하는 오라클, PostgreSQL, H2 데이터베이스에서 사용할 수 있습니다.
TABLE
TABLE 전략은 키 생성 전용 테이블을 하나 만들고, 여기에 이름과 값으로 사용할 컬럼을 만들어 데이터베이스 시퀀스를 흉내내는 전략입니다. 이 전략은 테이블을 사용하기 때문에, 시퀀스를 지원하지 않는 데이터베이스에서도 사용할 수 있습니다.
AUTO
데이터베이스는 종류도 많고 기본 키를 만드는 방법도 다양합니다.
AUTO로 설정하면 데이터베이스 방언에 따라 IDENTITY, SEQUENCE, TABLE 전략 중 하나를 자동으로 선택합니다.
@GeneratedValue의 strategy의 기본값은 AUTO입니다.
만약 AUTO를 사용할 때 SEQUENCE나 TABLE 전략이 선택되면, 시퀀스나 키 생성용 테이블을 미리 만들어 두어야 합니다.
만약 스키마 자동 생성 기능(ddl-auto)을 사용한다면, 하이버네이트가 기본값을 사용해서 적절하게 만들어줍니다.