🧷 @GenericGenerator

정의

@GenericGeneratorHibernate에서 사용자 지정 식별자 생성 전략을 정의하는 애너테이션이다. @GeneratedValuegenerator 속성과 함께 사용해서 기본 제공 전략으로 처리하기 어려운 식별자 생성 방식을 적용할 수 있다.

기본적으로 JPA의 @GeneratedValue는 표준적인 생성 전략을 제공하지만, 프로젝트에 맞는 커스텀 생성 규칙이 필요할 때 @GenericGenerator를 사용한다.

🧩 역할

  • Hibernate 전용 식별자 생성 전략을 정의한다
  • ==@GeneratedValue(generator = "...")와 연결해서 사용한다**
  • **시퀀스, UUID, prefix가 포함된 문자열 등 커스텀 PK 생성에 활용한다==

🛠 사용법

커스텀 생성기 클래스 작성

import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.IdentifierGenerator;

import java.io.Serializable;

public class StringSequenceIdentifierGenerator implements IdentifierGenerator {
    @Override
    public Serializable generate(SharedSessionContractImplementor session, Object object) {
        String sql = "SELECT my_sequence.NEXTVAL FROM DUAL";
        Long seqValue = ((Number) session.createNativeQuery(sql).getSingleResult()).longValue();
        return String.valueOf(seqValue);
    }
}

엔티티에 적용

import org.hibernate.annotations.GenericGenerator;

@Entity
public class Role {
    @Id
    @Column(name = "ROLE_PK")
    @GeneratedValue(generator = "role_seq_gen")
    @GenericGenerator(
            name = "role_seq_gen",
            strategy = "com.example.StringSequenceIdentifierGenerator"
    )
    private String pk;
}

사용 예시

  • Oracle 시퀀스 기반 문자열 PK 생성
  • UUID 규칙을 반영한 문자열 키 생성
  • 접두어가 포함된 업무용 식별자 생성

⚠️ 주의사항

  • @GenericGenerator는 JPA 표준이 아니라 Hibernate 전용 기능이다.
  • 생성 로직이 프로젝트마다 달라지므로 재사용성을 고려해야 한다.
  • 커스텀 생성기는 @GeneratedValue와 함께 사용해야 한다.
  • DB 시퀀스나 UUID 정책과 충돌하지 않도록 생성 규칙을 명확히 해야 한다.

📌 정리

  • @GenericGenerator는 Hibernate 전용 커스텀 식별자 생성 설정이다.
  • @GeneratedValue(generator = "...")와 함께 사용한다.
  • 표준 전략으로 해결하기 어려운 PK 생성 규칙이 있을 때 유용하다.

연결문서

댓글남기기