Spring Boot迁移java.time时Hibernate Timestamp列校验报错求助
解决Hibernate Schema校验中日期类型不匹配问题
针对你遇到的问题,以下是具体的解决步骤:
1. 添加Hibernate JavaTime支持依赖
Hibernate 5.2对Java 8+的java.time类型支持需要单独引入hibernate-java8依赖(兼容Java 11)。如果使用Maven,在pom.xml中添加:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-java8</artifactId> <version>5.2.10.Final</version> </dependency>
Gradle则添加:
implementation 'org.hibernate:hibernate-java8:5.2.10.Final'
2. 配置正确的PostgreSQL方言
确保你的Hibernate方言使用支持java.time的版本,在application.properties或application.yml中设置:
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL95Dialect
旧版方言(如PostgreSQLDialect)无法正确映射java.time类型到PostgreSQL的timestamp列。
3. 实体类字段的正确注解配置
方案一:使用java.time.LocalDateTime+@Type注解
直接使用LocalDateTime类型,并指定Hibernate的对应类型映射:
@Column(name = "header_date_created") @Type(type = "org.hibernate.type.LocalDateTimeType") private LocalDateTime headerDateCreated;
方案二:显式指定列定义
如果仍有问题,可以在@Column中明确指定数据库列类型,强制Hibernate校验时匹配:
@Column(name = "header_date_created", columnDefinition = "timestamp") private LocalDateTime headerDateCreated;
4. 确认数据库列类型无误
再次检查daily_count表的header_date_created列,确保实际类型是timestamp(而非date)。可以通过PostgreSQL命令行执行以下语句验证:
SELECT data_type FROM information_schema.columns WHERE table_name = 'daily_count' AND column_name = 'header_date_created';
5. 排查Hibernate类型映射优先级
如果之前使用过Joda Time,可能存在残留的类型映射配置。检查是否有自定义的TypeContributor或Hibernate配置文件中覆盖了日期类型的映射,确保java.time类型的映射优先级更高。
内容的提问来源于stack exchange,提问作者DcookCRX
相关产品推荐
相关产品推荐

