본문 바로가기

카테고리 없음

[2022-09-25] 기본 키 매핑

반응형

기본키 매핑 어노테이션

@Id

@GeneratedValue

 

기본 키 매핑 방법

 - 직접 할당 : @Id만 사용

 - 자동 생성  (@GeneratedValue

    IDENTITY : 데이터베이스에 위임. MYSQL

    SEQUENCE : 데이터베이스 시퀀스 오브젝트 사용. ORACLE @SequenceGenerator 필요

    TABLE : 키 생성용 테이블 사용. 모든 DB에서 사용

       @TableGenerator 필요

    AUTO : 방언에 따라 자동지정. 기본값

 

 

@GeneratedValue.IDENTITY 전략 - 특징 => (나는 모르겠고, DB야 알아서 해줘)_

 - 기본 키 생성을 데이터베이스에 위임

 - 주로  MySQL, PostgreSQL, SQL Server, DB2에서 사용

    ( 예 : MySQL 의 AUTO_INCREMENT)
 - JPA는 보통 트랜잭션 커밋 시점에 INSERT SQL 실행

 - AUTO_INCREMENT는 데이터베이스에 INSERT_SQL을 실행한 이후에 ID 값을 알 수 있음.

    => jdbc 내부에 insert 시 해당 id값을 받아오도록 구현이 되어있어서, 영속 시킨 뒤 id값을 읽을수 있다.

 - IDENTITY 전략은 entityManager.persist() 시점에 즉시 INSERT SQL 실행하고 DB에서 식별자를 조회

 

@GeneratedValue.Sequence 전략  - 특징

  - 데이터베이스 시퀀스틑 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트.

    ( 오라클의 시퀀스)

 - @SequenceGenerator를 이용해 이름을 지정 할 수 있음

 - 오라클, PostgreSQL, DB2, H2 데이터베이스에서 사용

@Entity
@SequenceGenerator(
	name = "MEMBER_SEQ_GENERATOR",
    sequenceName = "MEMBER_SEQ", // 매핑 할 시퀀스 이름
    initialValue = 1, 
    allocationSize = 1
)
public class Memeber {
	..
	@Id
 	@GeneratorValue(
    	strategy = GenerationType.SEQUENCE,
        generator = "MEMBER_SEQ_GENERATOR"
    ) private Long id;
}

@GeneratedValue.Sequence 전략  -  @SequenceGenerator

    - 주의 : allocationSize 기본값이 50임.

 속성 설명 기본값
 name 식별자 생성기 이름 필수
sequenceName 데이터베이스에 등록되어 있는 시퀀스 이름 hibernate_sequence
initialValue DDL 생성 시에만 사용됨.
시퀀스 DDL을 생성할 때 처음 시작하는 값을 지정
1
allocationSize 시퀀스 한 번 호출에 증가하는 수(성능최적화에 사용)
데이터베이스 시퀀스 값이 하나씩 증가하도록 설정되어있다면 이 값을 반드시 1로 설정해야한다.
50
catalog, schema catalog, schema 지정  

 

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 - 속성

속성 설명 기본값
name 식별자 생성기 이름 필수
table 키 생성 테이블 명 hibernate_sequences
pkColumnName 시퀀스 컬럼명 sequence_name
valueColumnName 시퀀스 값 컬럼명 next_val
pkColumnValue 키로 사용 할 값 이름 엔티티 이름
initialValue 초기 값. 마지막으로 생성된 값이 기준임. 0
allocationSize 시퀀스 한 번 호출에 증가하는 수
(성능 최적화에 사용)
50
catalog, schema  db catalog, schema 이름  
uniqueConstraints(DDL) 유니크 제약조건 지정  

 

권장하는 식별자 전략

 - 기본키 제약 조건 : null 아님, 유일, 변하면 안된다

 - 미래까지 이 조건을 만족하는 자연키는 찾기 어렵다. 대리키(대체키)를 사용하자.

    ( 주민등록번호도 기본 키로 적절하지 않음.)

 

 - 권장 : Long 타입 + 대체키 + 키생성 전략 사용

반응형