[Java] @GenerativeValue의 개념과 예시
- -
@GenerativeValue
1) 개념
JPA에서 엔티티의 주요 키(primary key) 값을 자동으로 생성하는 방법을 지정하는데 사용
@GeneratedValue 애너테이션 바로 아래에 있는 필드가 주요 키(primary key)에 해당하는 필드입니다.
2) strategy
@GeneratedValue 애너테이션은 strategy 속성과 함께 사용됩니다.
strategy 속성은 주요 키 값을 생성하는 전략(strategy)을 지정하는 역할을 합니다.
일반적으로 세가지 주요 전략을 사용할 수 있습니다.
① GenerationType.IDENTITY
● 개념
데이터베이스의 자동 증가(auto-increment) 기능을 사용하여 기본 키 값을 생성합니다.
데이터베이스에 의존적인 전략으로, 대부분의 관계형 데이터베이스에서 지원합니다.
예를 들어, MySQL의 AUTO_INCREMENT를 사용하는 경우에 적용됩니다.
● 주의사항
대부분 데이터베이스의 자동 증가(auto-increment) 기능과 함께 주요 키(primary key)를 생성하기 위해 사용됩니다.
즉, 주요 키에 GenerationType.IDENTITY를 사용하는 경우가 일반적입니다.
주요 키 이외의 다른 필드에 GenerationType.IDENTITY를 사용하는 것은 적합하지 않을 수 있음. (다른 방법 이용 추천)
● 예시1
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Id
// 해당 필드가 주요키 (Primary Key)임을 나타내는 애너테이션
@GeneratedValue(strategy = GenerationType.IDENTITY)
// GenerationType.IDENTITY 전략을 사용하여 id 필드의 값을 자동으로 생성한다는 것을 나타냅니다.
// 데이터베이스의 자동 증가(auto-increment) 기능을 활용하여 기본 키 값을 생성
private Long id;
● 예시2
@Entity
@Table(name = "orders")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long orderNumber;
// 주문 엔티티의 다른 필드들
// 생성자, getter, setter 등
}
@Entity
@Table(name = "orders")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long orderNumber;
// orderNumber 필드의 값을 자동으로 생성
// 주문 엔티티의 다른 필드들
// 생성자, getter, setter 등
}
② GenerationType.SEQUENCE
● 개념
데이터베이스 시퀀스(sequence)를 사용하여 기본 키 값을 생성합니다.
데이터베이스 종류에 따라 시퀀스를 지원하는 경우에 사용할 수 있습니다.
※ 시퀀스 : 시퀀스는 데이터베이스에서 생성된 고유한 순차적인 숫자를 생성하는 객체
(시퀀스를 지원하는 데이터베이스 : Oracle, PostgreSQL, DB2, H2 등)
● 구조
@SequenceGenerator(name = "시퀀스 생성기 이름", sequenceName = "데이터 베이스에서 사용될 시퀀스 이름", allocationSize = 할당 크기)
public class 엔티티 이름 {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "시퀀스 생성기 이름")
필드;
}
0) @SequnceGenerator : 시퀀스 생성을 위한 애너테이션 (이름, 시작값, 크기 등을 지정할 수 있음)
1) name : 시퀀스 생성기 이름
2) sequenceName : 데이터베이스에서 사용될 시퀀스 이름
3) allocationSize : 시퀀스에서 한번에 할당되는 값의 크기
● 예시
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence_generator")
@SequenceGenerator(name = "sequence_generator", sequenceName = "my_sequence")
private Long id;
@Id
@SequenceGenerator(name = "sequence_generator", sequenceName = "my_sequence")
// 시퀀스 생성기의 이름은 sequence_generator
// 데이터베이스에 사용될 시퀀스 이름은 my_sequence
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence_generator")
//SEQUENCE 전략을 사용하고, 그 시퀀스 생성기의 이름은 위의 sequence_generator임을 나타냄
private Long id;
● 예시2
@Entity
@Table(name = "employees")
@SequenceGenerator(name = "employee_sequence", sequenceName = "employee_seq", initialValue = 1, allocationSize = 1)
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "employee_sequence")
private Long id;
private String name;
// Constructors, getters, setters
}
@Entity
@Table(name = "employees")
@SequenceGenerator(name = "employee_sequence", sequenceName = "employee_seq", initialValue = 1, allocationSize = 1)
// 시퀀스 생성기를 정의하는 애너테이션
// 시퀀스 생성기의 이름은 employee_sequence
// 데이터베이스에 사용될 시퀀스의 이름은 employee_seq
// 초기값은 1, 할당크기는 1
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "employee_sequence")
// SEQUENCE 전략으로 주요키를 생성하고 생성기의 이름은 employee_sequence
private Long id;
private String name;
// Constructors, getters, setters
}
● 활용
그럼 시퀀스 생성을 코드로 하는 방법은 위에서 설명하였습니다.
데이터베이스에서는 그럼 어떤 일을 해야할까요?
PostgreSQL 데이터베이스 예시를 보여주겠습니다.
1) 데이터베이스에 접속합니다.
2) 쿼리를 생성하여줍니다.
CREATE SEQUENCE my_sequence START WITH 1 INCREMENT BY 1;
이 쿼리는 my_sequence라는 이름의 시퀀스를 생성하고, 시작값은 1이며 1씩 증가하는 것을 의미합니다.
3) 시퀀스를 사용하여 데이터를 삽입하거나 업데이트할 때 시퀀스를 참조하는 필드에 NEXTVAL 함수를 사용하여 시퀀스 값을 가져올 수 있습니다.
INSERT INTO 테이블명 (주요키열, 다른열1, 다른열2) VALUES (NEXTVAL('my_sequence'), '값1', '값2');
(이 코드는 데이터를 테이블에 삽입하는 것이고, 시퀀스를 수정하는 내용은 아님)
4) Java에서 시퀀스 생성
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence_generator")
@SequenceGenerator(name = "sequence_generator", sequenceName = "my_sequence")
private Long id;
시퀀스 생성기의 이름이 PostgreSQL에서 만든것과 동일해야하는 것이 아니라,
실제로 데이터베이스에서 사용할 시퀀스 이름(sequenceName)과 PostgreSQL에서 만든 이름과 같아야합니다. => my_sequence
③ GenerationType.TABLE
● 개념
별도의 키 생성용 테이블을 사용하여 기본 키 값을 생성합니다.
데이터베이스의 테이블에 값을 저장하고 조회하는 방식입니다.
JPA 구현체(예: Hibernate)가 주요 키 값을 생성하기 위해 자체적으로 테이블을 생성하고 관리하기 때문에
데이터베이스에서 추가적인 작업을 할 필요가 없습니다.
● 구조
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "table_generator")
@TableGenerator(name = "table_generator", table = "id_generator", pkColumnName = "pk_name", valueColumnName = "pk_value", pkColumnValue = "member_id", allocationSize = 1)
private Long id;
0) @TableGenerator : 테이블 생성을 위한 애너테이션
1) name : 테이블 생성기 이름
2) talbe : 데이터베이스에서 사용될 테이블 이름
3) pk(primary key)
● 예시
@Entity
@Table(name = "members")
@TableGenerator(name = "member_generator", table = "id_generator", pkColumnName = "id_key", pkColumnValue = "member_id", allocationSize = 1)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "member_generator")
private Long id;
// 다른 필드들
// 생성자, getter, setter 등
}
④ GenerationType.AUTO
● 개념
JPA 구현체에 따라 자동으로 적절한 전략을 선택하도록 합니다.
주로 데이터베이스의 자동 증가(auto-increment) 기능이 있는 경우에는 해당 기능을 사용하고,
그렇지 않은 경우에는 시퀀스(sequence)나 테이블(Table Generator) 등의 다른 전략을 선택할 수 있습니다.
● 예시
@Entity
@Table(name = "members")
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
// 다른 필드들
// 생성자, getter, setter 등
}
2023.07.12 - [Java] - [JPA] 코드 예제 Part.1) JPA 학습 전 흉내내보기
'Java' 카테고리의 다른 글
[Java] JPA 관계 매핑: @OneToMany, @ManyToOne, @OneToOne, @ManyToMany Annotation, 관계의 주인 정리 (0) | 2023.07.14 |
---|---|
[Java] 코드 예제 Part.1) JPA 학습 전 흉내내보기 (0) | 2023.07.12 |
[Java] 자바의 조건문: if, if-else, else if 등의 개념과 예시 (0) | 2023.07.12 |
[Java] public static void main(String[] args)가 무엇일까? (0) | 2023.07.11 |
[Java] 메소드 선언 Method Declaration (0) | 2023.07.11 |
소중한 공감 감사합니다