JPA

Schema-validation: wrong column type encountered ... 오류 관련

쿠카이든 2023. 9. 4. 10:02
728x90
  • 엔티티
@Entity
@Table(name = "users")
@SequenceGenerator(name = "USERS_SEQ_GENERATOR", sequenceName = "USERS_SEQ", initialValue = 1, allocationSize = 1)
class User(
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USERS_SEQ_GENERATOR")
    val id: Long = 0L,

    @Column(nullable = false, updatable = false)
    val username: String,
                        ...
)

 

  • 스키마
CREATE TABLE users
(
    id            NUMERIC(19, 0) NOT NULL,
    username      VARCHAR2(50)   NOT NULL,
    email         VARCHAR2(255)  NULL,
                       ---
)

 

  • application.yml
spring:
  jpa:
    hibernate:
      ddl-auto: validate

 

  • 위와 같이 작성 후 실행하였을 때, 아래와 같은 에러가 발생하였다.
 

Schema-validation: wrong column type encountered in column… 에러 발생

 

  •  원인
    • 해당 에러는 데이터 베이스 스키마와 JPA 엔티티 클래스의 타입이 일치하지 않아 발생한다.
    • 즉, 하이버네이트에서 id 필드를 numeric 타입으로 발견했지만, JPA는 Entity의 Long 타입을 보고 bigint로 예상하고 있어 타입 불일치로 오류가 발생하였다.

 

  • 해결실패 기록
    • AttributeConverter를 사용해서 DB 컬럼 자체의 타입을 변경하여 해결하고 했지만, @Id 어노테이션과 Converter를 함께 사용할 수 없어서 해당 방법으로는 해결할 수 없었다.
@Converter(autoApply = true)
class LongAttributeConverter : AttributeConverter<Long?, BigDecimal?> {
    override fun convertToDatabaseColumn(entityValue: Long?): BigDecimal? {
        return entityValue?.let { BigDecimal.valueOf(it) }
    }

    override fun convertToEntityAttribute(databaseValue: BigDecimal?): Long? {
        return databaseValue?.toLong()
    }
}

 

  • 해결방안
    • 아래와 같이 Entity에서 @Column(columnDefinition = "")을 사용해 id 컬럼의 정의를 명확히 명시하여, JPA의 예상 타입을 numeric으로 설정한다. 
@Entity
@Table(name = "users")
@SequenceGenerator(name = "USERS_SEQ_GENERATOR", sequenceName = "USERS_SEQ", initialValue = 1, allocationSize = 1)
class User(
    @Id
    @Column(columnDefinition = "NUMERIC(19, 0)")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USERS_SEQ_GENERATOR")
    val id: Long = 0L,

    @Column(nullable = false, updatable = false)
    val username: String,
                           ---
)

 

참고 : https://yeongchan1228.tistory.com/139

 

Jpa Validate 에러 (with. Oracle DB, h2)

프로젝트를 진행하며, Local, Dev, Prod 환경에서는 Oracle Database를 사용하고, Test 환경에서는 H2 데이터 베이스를 사용했다. ✔ Entity @Entity @Table(name = "users") @SequenceGenerator(name = "USERS_SEQ_GENERATOR", sequence

yeongchan1228.tistory.com

 

728x90