방명록
- [스프링 부트][문제해결] MySQL에서 JPA로 Table 생성시 만나게된 에러, 범인은 columnDefinition!2022년 08월 16일 17시 14분 31초에 업로드 된 글입니다.작성자: DandyNow728x90반응형
패스트 캠퍼스의 "Java&Spring boot로 시작하는 웹 프로그래밍"의 Final 과제를 수행하고 있다. "데이터베이스 연동 설계와 구현"의 6번 "게시판 테이블과 시퀀스는 Board 엔티티에 설정된 Annotation을 기반으로 자동으로 생성되도록 합니다."를 구현하던 중 아래와 같은 에러를 만나게 되었다.
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL 블라 블라~
Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 블라 블라~해당 Entity 코드는 다음과 같다.
package com.example.board.model.entity; import java.time.LocalDateTime; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import org.hibernate.annotations.ColumnDefault; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor @Entity public class Board { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long seq; @Column(length = 200, nullable = false) private String title; @Column(length = 20, nullable = false) private String writer; @Column(length = 2000, nullable = false) private String content; @Column(nullable = false, columnDefinition = "date default sysdate") private LocalDateTime regDate; @Column(columnDefinition = "number default 0") private Long cnt; }
private 변수를 모두 주석 처리 후 하나씩 주석을 풀어가며 어떤 변수에서 문제가 발생하는지 확인했다. 그 결과 @Column 어노테이션의 columnDefinition 설정 값이 문제였음을 확인할 수 있었다.
시스템 날짜 정보가 자동으로 입력되어야 하는 regDate의 경우 Default 값으로 "CURRENT_TIMESTAMP"가 적용되어야 하는데 "date default sysdate"는 올바른 문법이 아니었던 모양이다. 검색 결과 다음의 자료가 속 시원한 답을 주었다.
https://dev-elop.tistory.com/entry/JPA-Entity-CURRENTTIMESTAMP-%EC%83%9D%EC%84%B1%EB%B2%95
private 변수 중 Long cnt의 경우에는 MySQL에서 datatype을 BIGINT로 설정되도록 해야 하므로 columnDefinition을 "bigint default 0"으로 설정하였더니 원하는 결과를 얻을 수 있었다. 최종 코드는 다음과 같다.
package com.example.board.model.entity; import java.time.LocalDateTime; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor @Entity public class Board { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long seq; @Column(length = 200, nullable = false) private String title; @Column(length = 20, nullable = false) private String writer; @Column(length = 2000, nullable = false) private String content; @Column(nullable = false, updatable = false, insertable = false, columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") private LocalDateTime regDate; @Column(columnDefinition = "bigint default 0") private Long cnt; }
이제 모두가 평화로워졌다!
728x90반응형'언어·프레임워크 > Spring Boot' 카테고리의 다른 글
다음글이 없습니다.이전글이 없습니다.댓글