오류 해결/JPA

[JPA 오류] org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL

Kyle H 2023. 4. 8. 21:10

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