@Id
데이터베이스 테이블의 기본 키(PK)와 객체의 필드를 매핑시켜주는 어노테이션
@Id만 사용할 경우 기본 키를 직접 할당해 주어야 하며, 데이터가 생성해주는 값을 사용하려면 @GeneratedValue를 사용한다.
@GeneratedValue
기본 키를 자동 생성해주는 어노테이션
속성으로는 startegy가 있으며, 이를 통해 자동 생성 전략을 지정할 수 있음.
IDENTITY
@GeneratedValue(strategy = GenerationType.IDENTITY)
기본 키 생성을 데이터베이스에 위임하는 전략
주로 MySQL, PostgreSQL, SQL Server에서 사용합니다.
예를 들어 MySQL의 AUTO_INCREMENT 기능은 데이터베이스가 기본 키를 자동으로 생성해줍니다.
IDENTITY 전략은 AUTO_INCREMENT처럼 데이터베이스에 값을 저장하고 나서야 기본 키 값을 구할 수 있을 때 사용합니다.
엔티티가 영속 상태가 되기 위해서는 식별자가 필수입니다.
그런데 IDENTITY 전략을 사용하면 식별자를 데이터베이스에서 지정하기 전까지는 알 수 없기 때문에, em.persist()를 하는 즉시 INSERT SQL이 데이터베이스에 전달됩니다.
따라서 이 전략은 트랜잭션을 지원하는 쓰기 지연이 동작하지 않습니다.
SEQUENCE
• 데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트(예: 오라클 시퀀스)
• 오라클, PostgreSQL, DB2, H2 데이터베이스에서 사용
@Entity
@SequenceGenerator(
name = “MEMBER_SEQ_GENERATOR",
sequenceName = “MEMBER_SEQ", //매핑할 데이터베이스 시퀀스 이름
initialValue = 1, allocationSize = 1)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
@SequenceGenerator 속성
IDENTITY와 SEQUENCE의 차
시퀀스 전략은 em.persist()를 호출할 때 먼저 데이터베이스 시퀀스를 사용해서 식별자를 조회합니다.
그리고 조회한 식별자를 엔티티에 할당한 후, 해당 엔티티를 영속성 컨텍스트에 저장합니다.
이후 트랜잭션 커밋 시점에 플러시가 발생하면 엔티티를 데이터베이스에 저장합니다.
IDENTITY 전략은 먼저 엔티티를 데이터베이스에 저장한 후에 식별자를 조회하여, 엔티티의 식별자에 할당한 후, 영속성 컨텍스트에 저장합니다.
TABLE
TABLE 전략은 키 생성 전용 테이블을 하나 만들고, 여기에 이름과 값으로 사용할 컬럼을 만들어 데이터베이스 시퀀스를 흉내내는 전략 -> 모든 데이터베이스에서 사용가능
create table MY_SEQUENCES (
sequence_name varchar(255) not null,
next_val bigint,
primary key ( sequence_name )
)
@Entity
@TableGenerator(
name = "MEMBER_SEQ_GENERATOR",
table = "MY_SEQUENCES",
pkColumnValue = “MEMBER_SEQ", allocationSize = 1)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
@TableGenerator 속성
Reference
https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
[JPA] 기본 키(Primary Key)매핑 - @Id, @GeneratedValue — Shin._.Mallang (tistory.com)
'🍀Spring > JPA' 카테고리의 다른 글
[JPA] 다양한 연관관계 매핑 (0) | 2024.07.18 |
---|---|
[JPA] 연관관계 매핑 - 양방향 연관관계와 연관관계의 주인 (0) | 2024.07.06 |
[JPA] 연관관계 매핑 - 단방향 연관관계 (0) | 2024.07.06 |
[JPA] 필드와 컬럼 매핑 (@Column) (0) | 2024.07.04 |
[JPA] 엔티티 매핑 (@Entity, @Table) (0) | 2024.07.04 |