JPA에서 칼럼명을 'order'로 할 경우 생기는 문제와 기본값을 처리하는 방법

2022. 5. 13. 01:08Web/Spring

반응형

velog에서 옮겨온 글 입니다.

원본 날짜: 2022-01-06T13:38:03.117Z

JPA에서 칼럼명을 'order'로 할 경우 생기는 문제

org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "
    create table course_featured_relation (
           ...
        order tinyint not null,
        ...
    ) engine=InnoDB" via JDBC Statement
    .
    .
    .
    Caused by: java.sql.SQLSyntaxErrorException: (conn=99720) You have an error in your SQL syntax; ... near 'order tinyint not null,
  • order는 MySQL/MariaDB상에서 예약어(reserved word)이므로 order tinyint not null이라는 문장은 SQL 문법 ORDER로 인식됨
  • order 주위에 하이픈(`)을 넣어서 `order` tinyint not null로 실행하면 동작은 함. 다만, order이 칼럼명으로써 좋은건 아님.

결국 orderplace_order, course_order등 주체가 되는 Entity명을 prefix로 붙여서 칼럼명을 수정함

JPA에서 칼럼의 기본값을 처리하는 방법

org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "
    create table user (
        ...
        gender char(1) default U not null,
        ...
    ) engine=InnoDB" via JDBC Statement
    .
    .
    .
    Caused by: java.sql.SQLSyntaxErrorException: (conn=99756) Unknown column 'U' in 'DEFAULT'
  • 해당 문제도 JPA에 의해 생성되는 CREATE문에서 기본값 U를 인식하지 못해서 생긴 오류임
  • JPA는 @ColumnDefault("~")안의 문자열을 그대로 SQL문 안에 넣는듯 하다. 따라서 하이픈(`) 또는 따옴표(')로 감싸주면 해결
@Column(name = "gender", nullable = false)
@ColumnDefault("'U'")
private Gender gender;

참조

 

 

반응형