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
728x90
'JPA' 카테고리의 다른 글
(로그 관련) p6spy 설정 방법 (0) | 2023.06.22 |
---|---|
Entity Manager Factory와 persist, flush, commit (0) | 2023.03.06 |
영속성 전이(CASCADE)에 관해 (2) | 2022.10.06 |
SpringBoot JPA Multiple Databases 설정 (0) | 2022.10.02 |
Java8 Optional 의 ifPresent 활용 (2) | 2022.09.01 |