Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: ... expected "identifier"; SQL statement:

오늘의 에러

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "ALTER TABLE ORDER_DETAIL ADD CONSTRAINT FKPLAM7WXC4TJBGEX0XYK8F0QXO FOREIGN KEY (ORDER_ID) REFERENCES ORDER[*] (ORDER_ID) "; expected "identifier"; SQL statement:


문제

구조는 Order 엔티티가 OneToManyOrderDetail 엔티티들을 가지고 있는 형태이다. 

Order.java
@Entity
@Table(name = "ORDER")
public class Order {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ORDER_ID", nullable = false)
    private Long id;

    @OneToMany
    @JoinColumn(name = "ORDER_ID")
    private List<OrderDetail> orderDetailList;

    ...
}


OrderDetail.java
@Entity
@Table(name = "ORDER_DETAIL")
public class OrderDetail {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ORDER_DETAIL_ID", nullable = false)
    private Long id;

    @Column(name = "ORDER_ID", nullable = false)
    private Long orderId;

    ...
}


스프링 부트 어플리케이션을 시작하니  expected "identifier" 어쩌구  하는 에러가 난다. 

에러 메세지를 대충 보았을땐 다 맞게 한 것 같은데 왜 저러는지 이해가 안갔는데 구글신님께서 나와 동일한 문제의 포스트를 찾아주셨다.

답은 Order 엔티티의 테이블 명 때문이다. OrderSQL키워드 중 하나이기 때문에 테이블 이름으로 사용 할 수 없다...


해결 방법

해결 방법은 간단히 다른 테이블 명을 사용하면 된다. 


변경 전
@Table(name = "ORDER")

변경 후
@Table(name = "ORDER_TABLE")