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
- 위와 같이 작성 후 실행하였을 때, 아래와 같은 에러가 발생하였다.
- 원인
- 해당 에러는 데이터 베이스 스키마와 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