HwangHub

hibernate_sequence doesn't exist 본문

DEV-STUDY/Spring

hibernate_sequence doesn't exist

HwangJerry 2023. 12. 31. 16:44

Entity의 PK를 @GeneratedValue(strategy = GenerationType.AUTO)로 해두었을 때 발생한 문제이다. 이 문제는 hibernate_sequence라는 테이블에서 PK를 조회하는데 해당 테이블이 존재하지 않아서 발생한다.

hibernate_sequence 테이블이란?

Hibernate5는 GenerationType.AUTO로 PK 생성 전략을 설정하면 다음 순서로 처리한다.

  1. @Id로 매핑된 Entity의 Field Type이 UUID라면 UUID Generator를 사용하여 생성한다.
  2. Integer나 Long 과 같은 numerical 타입이라면 Hibernate 설정 파일을 스캔하여 identifierGenerator를 사용하고 있는지 검사한다.
  3. 만약 사용하지 않으면 GenerationType.IDENTITY와 같이 처리한다.
  4. 만약 사용한다면, 해당 DB가 GenerationType.SEQUENCE를 지원하는지 확인하고, 지원하면 SEQUENCE 방식으로 처리한다.
  5. SEQUENCE 방식도 지원하지 않으면 GenerationType.TABLE과 같이 처리한다. 이 때, 키 전용 테이블인 Hibernate_sequence 테이블을 생성하고, 이를 향후에 활용하여 pk generation을 처리한다.
    출처 : 티스토리 블로그

이 때 선택할 수 있는 방법이 두 가지 있다.

  1. DB 스키마 변경하기
  2. GenerationType 변경하기

첫번째 방법의 경우 일반적으로 ddl-auto를 update로 설정한다던가 하는 방식으로 대처하는 경우가 일반적인데, 이러한 방법은 운영 단계에서는 매우 리스크 있는 선택이다.

따라서 Database에 generationType을 위임하는 IDENTITY로 코드를 바꿔주었다.

AS-IS

public class Post extends BaseTimeEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

TO-BE

public class Post extends BaseTimeEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

출처1

Comments