JPA 자동 ddl 사용하여 테이블을 생성 중 다음의 오류가 발생했습니다.
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "
create table ...
중략
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "\000a create table candidate (\000a candidate_id bigint not null,\000a [*]month integer,\000a year integer,\000a nominated_member_id bigint,\000a primary key (candidate_id)\000a )"; expected "identifier"; SQL statement:
아래가 해당 Entity의 Java 코드입니다.
package pom.starpoint.domain;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import static jakarta.persistence.FetchType.*;
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Candidate {
@Id @GeneratedValue
@Column(name = "candidate_id")
private Long id;
@OneToOne(fetch = LAZY)
@JoinColumn(name = "nominated_member_id")
private Member nominatedMember;
private Integer month;
private Integer year;
}
GPT에게 바로 물어서 해결해 보겠습니다.
month가 예약어라고 하네요. GPT는 명시적으로 컬럼명을 바꿔서 사용하라고 조언했는데, 저는 그냥 Entity의 필드명 자체를 변경하도록 하겠습니다.
package pom.starpoint.domain;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import static jakarta.persistence.FetchType.*;
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Candidate {
@Id @GeneratedValue
@Column(name = "candidate_id")
private Long id;
@OneToOne(fetch = LAZY)
@JoinColumn(name = "nominated_member_id")
private Member nominatedMember;
private Integer voteMonth;
private Integer voteYear;
}
문제가 해결되었습니다.
해당 오류가 발생하면, 오류 발생 DDL에서 예약어가 될만한 것이 있는지 찾아봐야 될 거 같습니다.
참고가 될만한 오라클 예약어 리스트
https://docs.oracle.com/cd/A87860_01/doc/appdev.817/a42525/apb.htm