기본키(PK)를 지정한다. @Id 어노테이션 적용 가능한 타입은 기본형(int, long 등), 기본 래퍼형(Integer, Long 등), String, java.util.Date, java.sql.Date, java.math.BigDecimal, java.math.BigInteger 중 하나여야 한다. @GeneratedValue 없이 @Id 어노테이션만 사용한다면 직접 할당해 주어야 한다.
@GeneratedValue는 JPA가 테이블의 기본키 값을 자동 생성해주는 애노테이션이다.
속성으로 strategy가 있는데 자동 생성 전략을 지정해 주어야 한다.
public class Article {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
기본 키 생성을 데이터베이스에 위임한다.
즉 AUTO_INCREMENT 기능 처럼 id 값을 null로 하면 DB가 알아서 AUTO_INCREMENT 해준다. AUTO_INCREMENT 는 DB에 INSERT SQL을 실행한 이후에 id 값을 알 수 있다.
JPA 는 보통 트랜잭션 commit 시점에 INSERT SQL을 실행한다. IDENTITY 전략은 id 값을 설정하지 않고(null) INSERT Query 를 날리면 그때 id 의 값을 세팅한다. 따라서 id 값은 DB 에 값이 들어간 이후에서야 알 수 있다는 것이다.
엔티티가 영속 상태가 되기 위해서는 식별자가 필수인데 식별자를 DB 에서 지정하기 전까지는 알 수 없기때문에 EntityManager.persist() 를 하는 시점에 Insert SQL 을 실행하여 DB 에 식별자를 조회해오기 위해 전달된다. 따라서 IDENTITY 전략은 트랙잭션을 지원하는 쓰기 지연이 동작하지 않는다.