영속성 컨텍스트는 엔티티를 식별자 값으로 구분하므로 엔티티를 영속 상태로 만들려면 식별자 값이 반드시 있어야 한다.

기본키 생성 전략은 애플리케이션에서 직접 할당하는 방법과 자동생성하는 방법이 있다.

개발자 직접 할당

기본 키를 직접 할당하려면 @Id로 매핑하면 된다.@Id 애너테이션만 사용해서 할당 한다.

**@Id**
@Column(name = "id2")
private String id;

기본키 자동 생성

개발자가 엔티티에 직접 식별자를 할당하면 @ Id 어노테이션만 있으면 되지만,일일이 기본키를 입력하는 것은 사실상 불가능하다.

JPA에서는 이런경우 @GenerateValue 어노테이션을 사용하여 식별자 생성 전략을 선택하여 사용할 수 있다.

@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

IDENTITY 전략

IDENTITY 기본 키 생성을 데이터베이스에 위임하는 전략이며,데이터베이스 엔티티를 저장해서 식별자 값을 획득한 후 영속성 컨텍스트에 저장한다.

테이블에 데이터를 저장해야 식별자 값을 획득할 수 있다.

MySQL,SQL server, DB2에서 사용한다.

CREATE TABLE BOARD (
  ID INT   AUTO_INCREMENT PRIMARY KEY,
  text VARCHAR(255)
);
@Entity
public class Board{

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

}

SEQUENCE 전략

데이터 베이스 시퀀스에서 식별자 값을 획득한 후 영속성 컨텍스트에 저장한다.

시퀀스 전략은 이 시퀀스를 사용해서 기본 키를 생성한다.

시퀀스를 지원하는 오라클, PostgreSQL,DB2,H2 데이터베이스에서 사용할 수 있다.


@Entity
@SequenceGenerator( //시퀀스 객체
  name="BOARD_SEQ_GENERATOR"
  sequenceName ="BOARD_SEQ",
  initialValue=1,allocationSize=1)

@Id
@GenerateValue(strategy=GenerationType.SEQUENCE,
                generator="BOARD_SEQ_GENRATOR")
private Long id;

}
create sequence board_seq 
start with 1 
increment by 1;

@SequenceGenerator를 사용해서 Board_SEQ_GENERATOR라는 시퀀스 생성기를 등록했다.

@SequenceGenerator 속성 정리

—이하 참고—-

Table 전략

Auto 전략

데이터 베이스 방언에 따라 IDENTITY,SEQUENCE,TABLE 전략 중 하나를 자동으로 선택한다.

@Entity

public class Board{

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

기본 값은 AUTO이지만,권장 하지 않는다.

AUTO 전략의 장점은 데이터베이스를 변경해도 코드를 수정할 필요가 없다는 것이다.

키 생성 전략이 아직 확정되지 않은 개발 초기 단계나 프로토타입 개발 시 편리하게 사용할 수 있다.

AUTO를 사용할 때 SEQUENCE나 TABLE 전략이 선택되면 시퀀스나 키 생성용 테이블을 미리 만들어 두어야 한다

만약 스키마 자동 생성 기능을 사용한다면 하이버네이트가 기본값을 사용해서 적절한 시퀀스나 키 생성용 테이블을 만들어 줄 것이다.