오봉이와 함께하는 개발 블로그

JPA - 테이블 매핑 에러 해결 본문

Artineer 리뉴얼 프로젝트

JPA - 테이블 매핑 에러 해결

오봉봉이 2022. 9. 21. 17:15
728x90

상황

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에 위임하는 전략을 사용했다.

출처

728x90

'Artineer 리뉴얼 프로젝트' 카테고리의 다른 글

Form에서 @Embeddable 객체 응답받기  (1) 2022.09.23
기능 정리  (0) 2022.09.22
다시 시작  (0) 2022.09.20
중단  (0) 2022.05.26
Artineer - 프로젝트 패키지 구조  (0) 2022.05.20
Comments