kyucumber
전체 글 보기

테이블이 존재하는데도 Schema-validation missing table 예외가 발생하는 경우

아래와 같이 application이라는 엔티티와 테이블을 만들었습니다.

CREATE TABLE application (); @Entity @Table( name = "application", uniqueConstraints = [UniqueConstraint(columnNames = ["key"])], ) class ApplicationJpaEntity()

어플리케이션 구동시 ddl-auto는 validate로 설정해두었습니다.

spring: jpa: hibernate: ddl-auto: validate

위와 같이 설정하고, 테이블을 미리 생성해 테이블이 있는것을 Sequel Pro로 확인했음에도 불구하고 아래와 같은 에러가 지속적으로 발생했습니다.

Schema-validation: missing table [application]

해결 방법

명확한 원인을 직접 코드 레벨로 파악한 것은 아니지만 이름이 예약어와 겹치면서 문제가 발생하는 것 같았습니다. 아래 옵션을 추가해 문제를 해결했습니다.

hibernate: globally_quoted_identifiers: true globally_quoted_identifiers_skip_column_definitions: true

globally_quoted_identifiers옵션을 true로 지정하면 컬럼이나 테이블의 이름이 예약어와 충돌하는 것을 방지할 수 있습니다.

해당 옵션을 추가하면 컬럼, 테이블 이름을 Back Quote(`)로 감싸주게 됩니다.

충돌 방지를 위해 globallyquotedidentifiers 옵션을 추가했는데 이후 아래와 같은 예외가 발생하는 경우가 있습니다.

Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column

이는 globally_quoted_identifiers 옵션 사용 시 columnDefinition에 있는 단어들도 함께 escape 되면서 발생하는 에러입니다.

위와 같은 에러를 방지하기 위해 globally_quoted_identifiers_skip_column_definitions 옵션을 추가로 설정해주는 것이 좋습니다.

Reference

https://kwonnam.pe.kr/wiki/java/hibernate/configuration

Table of contents