source

스프링 부트 시 MariaDB에 잘못된 datetime을 삽입하면 null 필드가 아닌 null이 됩니다.

gigabyte 2022. 9. 4. 15:23
반응형

스프링 부트 시 MariaDB에 잘못된 datetime을 삽입하면 null 필드가 아닌 null이 됩니다.

Spring Boot 프로젝트에서 다음과 같은 테이블이 작성되는 문제가 있습니다.

create table task
(
    id int auto_increment
        primary key,
    title varchar(50) not null,
    content text not null,
    control_time datetime not null,
);

그 실체는 다음과 같습니다.

@Entity
data class Task(
        @Id @GeneratedValue var id: Long = 0,
        @Column(length = 50) var title: String = "",
        @Column(columnDefinition = "TEXT", length = 65535) var content = "",
        @Temporal(TemporalType.TIMESTAMP) var controlTime: Date = Date())

또한 작업을 매개 변수로 사용하는 엔드포인트도 있습니다. 여기서 잭슨은 작업을 JSON에서 작업 개체로 변환하여 디버깅 로그를 잘 볼 수 있습니다.

따라서 법적 범위를 벗어난 날짜(예를 들어 999년 이상)를 지정하면 휴지 상태가 오류 없이 유지되지만 필드에 null이 포함되어 Null이 아닌 경우에는 null이 포함되지 않습니다.mariadb가 법적 범위를 벗어난 것을 계속하면 오류가 발생한다고 생각합니다.수동으로 할 때처럼요.하지만 어떻게든 동면 상태가 되어 버립니다.결국 무효가 됩니다.

휴지 상태에서 추적:

26543 --- [nio-8080-exec-1] o.h.p.entity.AbstractEntityPersister     : Dehydrating entity: [something.model.Task#<null>]
2017-08-15 14:28:22.220 TRACE 26543 --- [nio-8080-exec-1]     o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [TIMESTAMP] - [Tue Aug 15 14:28:22 CEST 2017]
2017-08-15 14:28:22.221 TRACE 26543 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [2] as [VARCHAR] - [NIKlas]
2017-08-15 14:28:22.221 TRACE 26543 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [3] as [TIMESTAMP] - [null]
2017-08-15 14:28:22.222 TRACE 26543 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [4] as [TIMESTAMP] - [null]
2017-08-15 14:28:22.222 TRACE 26543 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [5] as [VARCHAR] - [null]
2017-08-15 14:28:22.222 TRACE 26543 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [6] as [TIMESTAMP] - [null]
2017-08-15 14:28:22.222 TRACE 26543 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [7] as [BIGINT] - [null]
2017-08-15 14:28:22.222 TRACE 26543 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [8] as [VARCHAR] - []
2017-08-15 14:28:22.223 TRACE 26543 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [9] as [TIMESTAMP] - [Mon Sep 10 05:06:44 CEST 12439173]
2017-08-15 14:28:22.224 TRACE 26543 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [10] as [BOOLEAN] - [null]
2017-08-15 14:28:22.224 TRACE 26543 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [11] as [VARCHAR] - []
2017-08-15 14:28:22.228 DEBUG 26543 --- [nio-8080-exec-1] o.h.id.IdentifierGeneratorHelper         : Natively generated identity: 2
2017-08-15 14:28:22.228 TRACE 26543 --- [nio-8080-exec-1] o.h.r.j.i.ResourceRegistryStandardImpl   : Releasing result set [org.mariadb.jdbc.internal.queryresults.resultset.MariaSelectResultSet$1@1c4fe495]
2017-08-15 14:28:22.228 DEBUG 26543 --- [nio-8080-exec-1] o.h.r.j.i.ResourceRegistryStandardImpl   : HHH000387: ResultSet's statement was not registered
2017-08-15 14:28:22.228 TRACE 26543 --- [nio-8080-exec-1] o.h.r.j.i.ResourceRegistryStandardImpl   : Closing result set [org.mariadb.jdbc.internal.queryresults.resultset.MariaSelectResultSet$1@1c4fe495]
2017-08-15 14:28:22.228 TRACE 26543 --- [nio-8080-exec-1] o.h.r.j.i.ResourceRegistryStandardImpl   : Releasing statement [HikariProxyPreparedStatement@639958422 wrapping sql : 'insert into task (created_at, created_by, deleted_at, updated_at, updated_by, closed_at, closed_by, content, control_time, is_successful, title) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', parameters : ['2017-08-15 14:28:22.147','NIKlas',<null>,<null>,<null>,<null>,<null>,'','12439173-09-10 05:06:44.928',<null>,'']]
2017-08-15 14:28:22.229 TRACE 26543 --- [nio-8080-exec-1] o.h.r.j.i.ResourceRegistryStandardImpl   : Closing prepared statement [HikariProxyPreparedStatement@639958422 wrapping sql : 'insert into task (created_at, created_by, deleted_at, updated_at, updated_by, closed_at, closed_by, content, control_time, is_successful, title) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', parameters : ['2017-08-15 14:28:22.147','NIKlas',<null>,<null>,<null>,<null>,<null>,'','12439173-09-10 05:06:44.928',<null>,'']]
2017-08-15 14:28:22.229 TRACE 26543 --- [nio-8080-exec-1] o.h.e.jdbc.internal.JdbcCoordinatorImpl  : Starting afterQuery statement execution processing [ON_CLOSE]
2017-08-15 14:28:22.231 DEBUG 26543 --- [nio-8080-exec-1] o.h.e.t.internal.TransactionImpl         : committing
2017-08-15 14:28:22.231 TRACE 26543 --- [nio-8080-exec-1] cResourceLocalTransactionCoordinatorImpl : ResourceLocalTransactionCoordinatorImpl#beforeCompletionCallback
2017-08-15 14:28:22.231 TRACE 26543 --- [nio-8080-exec-1] org.hibernate.internal.SessionImpl       : SessionImpl#beforeTransactionCompletion()
2017-08-15 14:28:22.232 TRACE 26543 --- [nio-8080-exec-1] org.hibernate.internal.SessionImpl       : Automatically flushing session
2017-08-15 14:28:22.232 TRACE 26543 --- [nio-8080-exec-1] o.h.e.i.AbstractFlushingEventListener    : Flushing session

관련 부분을 굵은 글씨로 표시하는 방법은 모르겠습니다만, 보시는 바와 같이 날짜 "12439173-09-10 05:06:44.928"을 불평 없이 삽입합니다.그런 다음 데이터베이스에서 "control_time" 값은 null입니다.

이 문제를 경험한 적이 있거나 어떻게 이런 일이 일어날 수 있는지 알고 있는 사람이 있습니까?

EDIT: 정의가 단순화되었기 때문에 정의 엔티티와 휴지 상태 트레이스 사이에 불일치가 있습니다.

언급URL : https://stackoverflow.com/questions/45693272/spring-boot-insert-invalid-datetime-into-mariadb-results-in-null-on-not-nullabl

반응형