영속성 컨텍스트는 엔티티를 식별자 값으로 구분하므로 엔티티를 영속 상태로 만들려면 식별자 값이 반드시 있어야 한다.
기본키 생성 전략은 애플리케이션에서 직접 할당하는 방법과 자동생성하는 방법이 있다.
기본 키를 직접 할당하려면 @Id로 매핑하면 된다.@Id 애너테이션만 사용해서 할당 한다.
**@Id**
@Column(name = "id2")
private String id;
@Id적용 가능 자바 타입
-자바 기본형
-자바 Wrapper형
-String
-java.util.Date
-java.sql.Date
-java.math.BigDecimal
-java.math.BigInteger
persist()를 호출 하기 전에 애플리케이션에서 직접 식별자 값을 할당해야 한다.만약 식별자 값이 없으면 예외가 발생한다.
Board board = new Board();
board.setId("id1"); //기본키 직접 할당
em.persist(board);
개발자가 엔티티에 직접 식별자를 할당하면 @ 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;
}
데이터 베이스 시퀀스에서 식별자 값을 획득한 후 영속성 컨텍스트에 저장한다.
시퀀스 전략은 이 시퀀스를 사용해서 기본 키를 생성한다.
시퀀스를 지원하는 오라클, 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 속성 정리
—이하 참고—-
데이터 베이스 방언에 따라 IDENTITY,SEQUENCE,TABLE 전략 중 하나를 자동으로 선택한다.
@Entity
public class Board{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
기본 값은 AUTO이지만,권장 하지 않는다.
AUTO 전략의 장점은 데이터베이스를 변경해도 코드를 수정할 필요가 없다는 것이다.
키 생성 전략이 아직 확정되지 않은 개발 초기 단계나 프로토타입 개발 시 편리하게 사용할 수 있다.
AUTO를 사용할 때 SEQUENCE나 TABLE 전략이 선택되면 시퀀스나 키 생성용 테이블을 미리 만들어 두어야 한다
만약 스키마 자동 생성 기능을 사용한다면 하이버네이트가 기본값을 사용해서 적절한 시퀀스나 키 생성용 테이블을 만들어 줄 것이다.