Hibernate映射LocalDateTime到TIMESTAMP时的Schema Validation错误
嘿,这个报错我太熟了!之前帮组里好几个同事踩过这个坑,本质就是Hibernate对LocalDateTime的映射逻辑跑偏了,大概率是你的实体类里有个小配置错误。咱们一步步来搞定:
先查最容易犯的错:有没有加错
@Lob注解?
赶紧去看你的实体类里requestDateTime字段,是不是不小心加了@Lob?比如这种踩坑写法:// 错误示例:@Lob会让Hibernate把LocalDateTime映射成bytea @Lob @Column(name = "request_date_time") private LocalDateTime requestDateTime;@Lob是用来存大文本或者二进制数据的,跟时间类型完全不搭边。加了它之后,Hibernate就会错误地把这个字段当成VARBINARY(对应PostgreSQL的bytea),自然和数据库里的TIMESTAMP对不上。直接删掉@Lob,90%的情况都能解决问题。兜底方案:显式指定数据库列类型
如果删掉@Lob还是不行,或者你想把映射关系写死避免后续出问题,就在@Column里用columnDefinition强制指定PostgreSQL的TIMESTAMP类型:@Column(name = "request_date_time", columnDefinition = "TIMESTAMP") private LocalDateTime requestDateTime;这样Hibernate在做schema校验的时候,就明确知道这个列应该是TIMESTAMP类型,不会再乱识别了。
老项目注意:检查Hibernate依赖
要是你的项目是Spring Boot 1.x或者Hibernate 5.0之前的老版本,可能需要额外引入hibernate-java8依赖才能支持Java 8的LocalDateTime这些新时间API。不过Spring Boot 2.x及以上的spring-boot-starter-data-jpa已经默认带了这个支持,所以这条主要给遗留项目参考。排除配置干扰
最后扫一眼你的application.properties/application.yml,有没有自定义的Hibernate类型配置?比如类似hibernate.type.preferred_instant_jdbc_type这种属性,可能会干扰时间类型的映射。如果有非必要的自定义配置,先注释掉再重启试试。
内容的提问来源于stack exchange,提问作者N. Labrahmi

