Hibernate 5.2.17相关问题:不支持ZonedDate及配置文件URL语法错误
解答你的Hibernate与MySQL问题
嘿,作为刚接触Hibernate和MySQL的初学者,遇到这两个问题很正常,我来帮你逐一解决:
问题1:Hibernate 5.2.17不接受ZonedDate格式
Hibernate 5.2.x版本基于JPA 2.1规范,而JPA 2.1原生只支持Java 8中的LocalDate、LocalDateTime、Instant、ZonedDateTime等日期时间类型,但**ZonedDate并不在标准支持列表里**(注意区分ZonedDate和ZonedDateTime,后者是官方支持的类型)。
你有两个实用的解决方向:
- 改用官方支持的类型:如果业务逻辑允许,把实体类中的
ZonedDate字段替换成ZonedDateTime,只要你的项目引入了hibernate-java8依赖(Maven/Gradle中添加对应依赖),Hibernate 5.2.17就能自动把这个类型映射到数据库的TIMESTAMP字段。 - 自定义属性转换器:如果必须保留
ZonedDate,可以创建一个AttributeConverter手动处理它和数据库字段的转换逻辑。示例代码如下:
import javax.persistence.AttributeConverter; import javax.persistence.Converter; import java.time.ZonedDate; import java.sql.Date; import java.time.ZoneId; @Converter(autoApply = true) public class ZonedDateConverter implements AttributeConverter<ZonedDate, Date> { @Override public Date convertToDatabaseColumn(ZonedDate zonedDate) { if (zonedDate == null) { return null; } return Date.valueOf(zonedDate.toLocalDate()); } @Override public ZonedDate convertToEntityAttribute(Date sqlDate) { if (sqlDate == null) { return null; } return sqlDate.toLocalDate() .atStartOfDay(ZoneId.systemDefault()) .toZonedDateTime() .toLocalDate() .atStartOfDay(ZoneId.systemDefault()) .toZonedDate(); } }
注意:这个转换器会把
ZonedDate转成数据库的DATE类型,会丢失时区信息。如果业务需要保留时区,更推荐用ZonedDateTime映射到TIMESTAMP字段。
问题2:hibernate.cfg.xml的URL配置语法错误
XML文件对特殊字符有严格的解析规则,其中&字符必须转义为&,否则会被当成XML实体的起始标记,直接触发语法错误。
你提供的代码片段里已经用了&,但大概率是你实际编写配置文件时直接写了&?正确的配置写法应该是这样的:
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydatabase?useLegacyDatetimeCode=false&serverTimezone=UTC&useSSL=false</property>
额外补充两个小提示:
- 确保MySQL Connector/J版本和Hibernate 5.2.17兼容,建议使用5.1.46以上或者8.0.12以上的版本;
- 如果Eclipse中仍报语法错误,可以右键配置文件→Validate,查看具体的错误提示,确认是不是转义字符的问题。
内容的提问来源于stack exchange,提问作者Sam Gold Man
相关产品推荐
相关产品推荐

