* 해당 게시글은 JPA의 공부를 위한 게시글로 JPA를 공부하며 이해했던 내용들을 정리하는 글입니다.
@Id와 @GeneratedValue 애노테이션을 식별자 변수에 추가하여 자동으로 증가된 값을 할당할 수 있습니다.
@GeneratedValue 속성은 2가지가 있습니다.
속성 | 설명 |
strategy | 식별자 값 자동 생성 전략을 선택한다.(GenerationType 지정) |
generator | 생성된 키 생성기를 참조한다. |
strategy 속성은 식별자 값 자동 생성 전략과 관련된 속성으로 TABLE, SEQUENCE, IDENTITY, AUTO 네 가지를 지정할 수 있습니다. 전략에 대한 설명은 다음과 같습니다.
PK 전략 | 해설 |
GenerationType.IDENTITY | auto_increment나 IDENTITY를 이용하여 PK값을 생성합니다. MySQL 같은 DBMS에서 사용 가능합니다. |
GenerationType.SEQUENCE | 시퀀스를 이용하여 PK값을 생성합니다. 오라클 같은 시퀀스를 지원하는 DBMS에서 사용 가능합니다. |
GenerationType.TABLE | 키 관리를 위한 전용 테이블을 사용하여 PK 값을 생성합니다. |
GenerationType.AUTO | 하이버네이트가 데이터베이스가 맞는 PK 값 생성 전략을 선택합니다. |
IDENTITY 전략
- EntityManager의 persist 메소드가 호출되는 순간 Insert 구문이 생성되어 데이터베이스에 전송됩니다.
- 데이터베이스에서 IDENTITY 전략으로 키를 생성한 후 엔티티 클래스의 식별자 변수에 할당합니다.
- 데이터가 추가된 것을 확인하려면 transaction이 commit 메소드가 호출 된 후 확인할 수 있습니다.
@Entity
@Data
@Table(name = "S_EMP")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(length = 25, nullable = false, name = "e_name")
private String name;
}
SEQUENCE 전략
- 유일키를 생성하기 위해 시퀀스라는 별도의 오브젝트를 사용하기때문에 IDENTITY 전략과 다름
- 시퀀스 오브젝트의 다음 값을 조회하여 해당 값을 식별자 변수에 할당
@Entity
@Data
@Table(name = "S_EMP")
@SequenceGenerator(name = "EMP_GENERATOR",
sequenceName = "EMP_SEQUENCE",
initialValue = 1,
allocationSize = 1)
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "EMP_GENERATOR")
private Long id;
@Column(length = 25, nullable = false, name = "e_name")
private String name;
}
TABLE 전략
- 데이터베이스에 종속되지 않으며 별도의 식별자 테이블을 생성하여 식별값을 관리
- SEQUENCE 전략과 동일한 방식으로 동작하지만 SEQUENCE 전략에 비해 성능 저하가 발생
@Entity
@Data
@Table(name = "S_EMP")
@TableGenerator(name = "EMP_GENERATOR",
pkColumnName = "SEQUENCE_NAME",
pkColumnValue = "SEQUENCE_EMP",
initialValue = 1,
allocationSize = 1)
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "EMP_GENERATOR")
private Long id;
@Column(length = 25, nullable = false, name = "e_name")
private String name;
}
자동전략
- 데이터베이스가 정해지지 않은 상태에서 사용하는 전략
@Entity
@Data
@Table(name = "S_EMP")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(length = 25, nullable = false, name = "e_name")
private String name;
}
출처
- JPA 퀵스타트 책 참고
'JPA' 카테고리의 다른 글
JPA 영속 컨텍스트와 엔티티 상태 (0) | 2020.12.12 |
---|---|
JPA 엔티티 클래스 관련 애노테이션 알아보기 (0) | 2020.12.10 |
JPA란? (0) | 2020.12.10 |