오봉이와 함께하는 개발 블로그
JPA - 테이블 매핑 에러 해결 본문
상황
application.properties
설정을 MySQL에 맞추고 데이터가 잘 들어가는지 실험을 했는데, 아래 설명할 오류 세 가지가 발생했다.
오류
ERROR 1054 (42S22): Unknown column '컬럼명' in 'field list'
이 오류는 @Embeded
타입인 Phone
엔티티 때문에 발생한 문제다.
해당 엔티티의 필드명은 firstNumber, middleNumber, lastNumber 세 가지가 있는데, JPA에서 엔티티 필드명과 DB 컬럼명을 메칭할 때 이름을 바꾼 다는 것을 생각하게 되었다.
엔티티 필드를 보통 카멜케이스로 작성할텐데 DB에는 관례상 언더스코어 방식을 사용해서 컬럼명 매칭을 first_Number로 하게 된다.
기존 DB 컬럼명은 firstNumber였는데, fitst_Number로 변경했더니 해결이 됐다.
두 번째로 Table 'DBNAME.TableName' doesn't exist.
오류가 발생했다.
해당 오류는 첫 번째 오류랑 연관되어 있는 오류로 데이터베이스 테이블명, 컬렴명을 변경하지 않고 해결할 수 있는 방법이다.
엔티티나 엔티티 필드명이 테이블명이나 테이블 컬럼명과 매칭이 되지 않아 발생하는 문제로 자바 코드 작성 관례(카멜케이스)와 DB 테이블, 컬럼명 작성 관례(언더스코어)와 달라서 발생한다.application.properties
에서 간단한 설정만 추가해도 어렵지 않게 해결할 수 있기 때문에 아래의 설정을 추가했다.
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
단점으로는 DBA가 따로 존재한다면 DB 관례와 다르기 때문에 DBA가 싫어할 수 있지만, 해당 프로젝트는 앞으로 DBA가 따로 없을 거 같기 때문에 해당 설정을 추가해서 진행하도록 하려한다.
마지막으로 org.hibernate.id.enhanced.TableStructure - could not read a hi value
오류가 발생했다.
이 오류는 식별자를 자동으로 생성할 때 발생하는 에러다.@GeneratedValue(strategy = GenerationType.AUTO)
(기본값)으로 했을 때 발생했다.
이유는 MySQL에서 테이블 생성할 때 PK를 Auto_Increment
로 해놨는데 위 설정은 하이버네이트 기본 설정 SequenceTable
에 따라 값이 생성되는 전략이라 MySQL의 생성 전략과 중복되어 발생한 문제다.@GeneratedValue(strategy = GenerationType.IDENTITY)
로 변경해서 기본키 생성 전략을 DB에 위임하는 전략을 사용했다.
출처
- https://velog.io/@mbsik6082/Table-DBNAME.TableName-doesnt-exist.-%ED%85%8C%EC%9D%B4%EB%B8%94%EC%9D%B4-%EC%A1%B4%EC%9E%AC%ED%95%98%EC%A7%80-%EC%95%8A%EB%8A%94%EB%8B%A4
- https://dogcowking.tistory.com/211
- https://rutgo-letsgo.tistory.com/306
- https://www.popit.kr/%ED%95%98%EC%9D%B4%EB%B2%84%EB%84%A4%EC%9D%B4%ED%8A%B8%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%9E%90%EB%8F%99-%ED%82%A4-%EC%83%9D%EC%84%B1-%EC%A0%84%EB%9E%B5%EC%9D%84-%EA%B2%B0%EC%A0%95%ED%95%98/
'Artineer 리뉴얼 프로젝트' 카테고리의 다른 글
Form에서 @Embeddable 객체 응답받기 (1) | 2022.09.23 |
---|---|
기능 정리 (0) | 2022.09.22 |
다시 시작 (0) | 2022.09.20 |
중단 (0) | 2022.05.26 |
Artineer - 프로젝트 패키지 구조 (0) | 2022.05.20 |