Posts 엔티티에서 데이터베이스 키워드/예약어 사용시 발생하는 문제
Post
Cancel

엔티티에서 데이터베이스 키워드/예약어 사용시 발생하는 문제

상황


  • 주문 테이블에 맵핑되는 엔티티를 만들기 위해 ‘Order’라는 클래스 생성
    1
    2
    3
    4
    5
    6
    7
    8
    
    @Getter
    @Setter
    @Entity
    public class Order {
      @Id
      private Long id;
      private OrderStatus orderStatus;
    }
    
  • 스프링 부트 실행하고 h2 db에 테이블 생성되나 확인하려고 하는데 아래와 같은 에러 발생하면서 테이블 생성이 안됨
    1
    2
    3
    4
    5
    6
    
    Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "
      CREATE TABLE ORDER[*] (
         ID BIGINT NOT NULL,
          ORDER_STATUS INTEGER,
          PRIMARY KEY (ID)
      ) "; expected "identifier"; SQL statement:
    

원인


  • Order라는 클래스 이름이 데이터베이스 키워드/예약어(예. ORDER, GROUP, SELECT, WHERE 등)에 이미 있기 때문에 스키마 생성에 실패한 것

해결방법


1. escape 문자(\) 사용

1
2
3
4
5
6
7
8
@Getter
@Setter
@Entity(name = "\"order\"")
public class Order {
    @Id
    private Long id;
    private OrderStatus orderStatus;
}

2. backtick 문자(`) 사용

1
2
3
4
5
6
7
8
@Getter
@Setter
@Entity(name = "`order`")
public class Order {
    @Id
    private Long id;
    private OrderStatus orderStatus;
}

3. globally_quoted_identifiers 설정값 세팅

4. 키워드/예약어 사용하지 않기

※ 1~3 번의 경우 네이티브 쿼리 작성시 테이블 명을 “order”로 적어줘야 한다.

선택한 방법


  • 네이티브 쿼리 사용시에도 불편하고, 김영한님 강의에서도 관례적으로 ORDERS라는 이름으로 사용한다고 하니 테이블 명을 ORDERS로 선언하자
    1
    2
    3
    4
    5
    6
    7
    8
    
    @Getter
    @Setter
    @Entity(name = "ORDERS")
    public class Order {
      @Id
      private Long id;
      private OrderStatus orderStatus;
    }
    

참고 자료


This post is licensed under CC BY 4.0 by the author.

엔티티에 있는 enum 타입 필드를 DB 컬럼에 어떻게 맵핑시킬 수 있을까 ?

MSA 환경에서 테스트하기(1) - 단위 테스트