workspace/backend
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 생성 전략을 설정하면 다음 순서로 처리한다.
- @Id로 매핑된 Entity의 Field Type이 UUID라면 UUID Generator를 사용하여 생성한다.
- Integer나 Long 과 같은 numerical 타입이라면 Hibernate 설정 파일을 스캔하여 identifierGenerator를 사용하고 있는지 검사한다.
- 만약 사용하지 않으면 GenerationType.IDENTITY와 같이 처리한다.
- 만약 사용한다면, 해당 DB가 GenerationType.SEQUENCE를 지원하는지 확인하고, 지원하면 SEQUENCE 방식으로 처리한다.
- SEQUENCE 방식도 지원하지 않으면 GenerationType.TABLE과 같이 처리한다. 이 때, 키 전용 테이블인 Hibernate_sequence 테이블을 생성하고, 이를 향후에 활용하여 pk generation을 처리한다.
출처 : 티스토리 블로그
이 때 선택할 수 있는 방법이 두 가지 있다.
- DB 스키마 변경하기
- 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;