如何通过Hibernate实体按指定格式在MySQL中存储时间戳
解决Hibernate时间戳存储格式问题
错误原因
你遇到的报错核心是类型不匹配:@CreationTimestamp和@UpdateTimestamp注解只能作用于日期时间类型的字段(比如LocalDateTime、Date),但你尝试给LocalDateTime类型的updatedOn字段赋值DateTimeFormatter实例,这两个类型完全不兼容,导致Hibernate初始化失败。
正确解决方案
1. 修正实体类代码
删掉错误的赋值语句,保持字段类型为LocalDateTime即可,注解保留:
@CreationTimestamp @Column(name="created_on", nullable = false, updatable = false) private LocalDateTime createdOn; @UpdateTimestamp @Column(name="updated_on", nullable = false) private LocalDateTime updatedOn;
2. 配置数据库映射与格式
要让MySQL以yyyy-MM-dd HH:mm:ss格式存储时间,只需确保以下两点:
指定正确的Hibernate方言:在
application.properties中添加(根据你的MySQL版本调整,MySQL8用下面的配置):spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect这个方言会自动将
LocalDateTime映射到MySQL的DATETIME类型,而MySQL的DATETIME默认存储格式就是yyyy-MM-dd HH:mm:ss。可选:强制数据库字段定义
如果需要明确指定数据库字段的类型和默认值,可以在@Column中添加columnDefinition:@CreationTimestamp @Column(name="created_on", nullable = false, updatable = false, columnDefinition="DATETIME DEFAULT CURRENT_TIMESTAMP") private LocalDateTime createdOn; @UpdateTimestamp @Column(name="updated_on", nullable = false, columnDefinition="DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP") private LocalDateTime updatedOn;不过
@CreationTimestamp和@UpdateTimestamp已经会自动生成时间,这个配置是额外的数据库层面保障。
注意事项
- 不要混淆日期时间类型和日期格式化器:
LocalDateTime用来存储时间数据,DateTimeFormatter是把时间数据转换成字符串的工具,不能直接赋值给时间字段。 - 如果需要在查询或返回结果时格式化时间字符串,应该在业务层或DTO层使用
DateTimeFormatter进行转换,而非在实体类中处理。
内容的提问来源于stack exchange,提问作者Deepak Bisht
相关产品推荐
相关产品推荐

