728x90
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "drop table if exists [*]like CASCADE "; expected "identifier"; SQL statement:
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "create table [*]like (like_id bigint generated by default as identity, created_at timestamp, last_modified_at timestamp, board_id bigint, member_id bigint, primary key (like_id))"; expected "identifier"; SQL statement:
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "alter table [*]like add constraint FK5ky5fxktwjhf2e9bqpkrfxlxk foreign key (board_id) references board"; expected "identifier"; SQL statement:
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "alter table [*]like add constraint FKdltj7tcxjpdeb0qmb26rn2yev foreign key (member_id) references member"; expected "identifier"; SQL statement:
토이 프로젝트로 게시판을 만들기 위해 Table을 만들던 도중 해당 에러를 만났다.
원인
JdbcSQLSyntaxErrorException는 SQL에서 사용하는 예약어를 사용했을 때 생기는 에러다.
이유는 간단하다. Like클래스와 동일한 이름이 SQL 예약어로 사용되고 있었기 때문이다.
이전에 Order 클래스도 같은 이유로 테이블명을 명시적으로 변경한적이 있어서 알고있었는데 Like도 SQL 예약어로 사용되고 있다는 생각을 못했다.
package hobin.toyBoard.like.entity;
import hobin.toyBoard.audit.Auditable;
import hobin.toyBoard.member.entity.Member;
import hobin.toyBoard.board.entity.Board;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.*;
@NoArgsConstructor
@Getter
@Setter
@Entity
public class Like extends Auditable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long likeId;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "BOARD_ID")
private Board board;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "MEMBER_ID")
private Member member;
}
해결 방법
Order 때와 마찬가지로 Like 테이블 이름을 @Table 애너테이션을 사용해 명시적으로 변경해주면 된다.
또는 클래스명 자체를 변경하는 방법이 있다. (ex. Like -> Vote)
package hobin.toyBoard.like.entity;
import hobin.toyBoard.audit.Auditable;
import hobin.toyBoard.member.entity.Member;
import hobin.toyBoard.board.entity.Board;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.*;
@NoArgsConstructor
@Getter
@Setter
@Entity
@Table(name = "likes")
public class Like extends Auditable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long likeId;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "BOARD_ID")
private Board board;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "MEMBER_ID")
private Member member;
}
정리
Table을 설계할 때 SQL문법을 사용하지 않게 조심하자
728x90