JPA 기초) 05 엔티티 식별자 생성 방식

meteorfish·2022년 11월 28일

JPA&SpringJPA기초

목록 보기
5/18

본 강의는 JPA & Spring Data JPA 기초 강의 공부용 정리입니다.


식별자 생성 방식

  • 직접 할당 방식
  • 식별 칼럼 방식
  • 시퀀스 사용 방식
  • 테이블 사용 방식

직접 할당 방식

  • @Id 설정 대상에 직접 값을 설정
@Entity
@Table(name = "hotel_info")
public class Hotel {
	@Id
    @Column(name = "hotel_id")
    private String id;
    ...
    protected Hotel() {}
    
    public Hotel(String id, String name, int year, Grade grade) {
    	this.id = id;
        this.name = name;
    }

저장하기 전에 생성자를 할당 (생성 시점에 전달)
위 코드에서 hotel 엔티티를 생성하는 시점에 id를 식별자로 전달!

Hotel hotel = new Hotel("H-001", ...); // 생성할 때 식별자를 전달!
entityManager.persist(hotel);
  • 쿼리문은 persist()가 아닌 commit() 시에 실행됨!

식별 칼럼 방식

  • (MySQL의 자동 증가 칼럼 같은) DB의 식별 칼럼에 매핑
    [ DB가 식별자 생성해서, 객체 생성시 식별값을 설정하지 않음 ]

[ 설정 방식 ]

  • @GeneratedValue(strategy = GenerationType.IDENTITY)

INSERT 쿼리를 실행해야 식별자를 알 수 있음!

  • EntityManager#persist() 호출 시점에 INSERT 쿼리 실행!
  • persist() 실행할 때 객체에 식별자 값 할당!

식별 칼럼 방식 예시


  • 직접 할당 처럼 생성 시점에 식별자 지정안함
  • 저장 시점에 INSERT 쿼리 바로 실행
  • persist() 이후부터 식별자가 할당되어 사용이 가능하다

시퀀스 사용 방식

  • 시퀀스를 사용해서 식별자 생성
    [ JPA가 식별자 생성해서, 객체 생성시 식별값을 설정하지 않음 ]

[ 설정 방식 ]

  • @SequenceGenerator : 시퀀스 생성기 설정
  • @GeneratedValue의 generator : 시퀀스 생성기 지정

EntityManager#persist() 호출 시점에 시퀀스 사용

  • persist() 실행할 때 객체에 식별자 값 할당!
  • INSERT 쿼리 실행안함

시퀀스 사용 방식 예시


SequenceGenerator 속성

name : GeneratedValue에서 사용할 이름 지정
sequnceName : 시퀀스 이름
schema : 스키마 이름
allocationSize : (여기선 설명 안함) 무조건 1로 설정

테이블 사용 방식

  • 테이블을 시퀀스처럼 사용
    - 테이블에 엔티티를 위한 키 보관
    • 해당 테이블을 이용해서 다음 식별자 생성

[ 설정 방식 ]

  • @TableGenerator로 테이블 생성기 설정
  • @GeneratedValue의 generator로 테이블 생성기 지정

EntityManager#persist() 호출 시점에 테이블 사용

  • persist() 실행할 때 테이블을 통해 식별자 구하고, 이를 엔티티에 할당!
  • INSERT 쿼리 실행안함

테이블 사용 방식 예시


[ 식별자 생성시 사용할 테이블의 구조 ]

  • 엔티티 이름 칼럼 (primary key)
  • 식별자 보관 칼럼 (bigint)

TableGenerator 설정의 속성

  • table : 식별자 생성시 사용할 테이블 이름 설정
  • pkColumname : 엔티티 이름을 보관할 컬럼
  • pkColumnValue : 엔티티 이름
  • valueColumnName : 다음 식별자를 구할때 사용할 컬럼
  • initialValue = 0 : 다음 식별자가 1부터 시작 (?)
  • allocationSize = 1 : 무조건 1로 설정 (다중 노드 환경에서 키가 중복될 수도 있음)

0개의 댓글