java.util.Date 从 hibernate-4 迁移到 hibernate-5 时格式输出发生变化
java.util.Date format output changes when migrating from hibernate-4 to hibernate-5
我目前正在尝试更新我们当前的一些库,但遇到了阻塞问题。这是一个遗留应用程序,这里是基本设置:
Java 8
Tomcat 7
Mysql 5.5.27-28.1-log Percona Server
Spring 4.2.4.RELEASE
相关的 Hibernate 版本在这里:
55:HIBERNATE_VERSION = "4.3.11.Final"
236: "org.hibernate:hibernate-core:jar:#{HIBERNATE_VERSION}",
239: "org.hibernate:hibernate-envers:jar:#{HIBERNATE_VERSION}",
241: "org.hibernate:hibernate-entitymanager:jar:#{HIBERNATE_VERSION}",
更新版本为:
HIBERNATE_VERSION = "5.2.12.Final"
我不会告诉你细节,但还有很多其他依赖项。我逐渐消除了所有其他更改(包括相关的 spring 更新),但上面列出的库是仅有的 3 个正在更改的库。
现在,由于日期格式已更改,其中一个前端客户端令人窒息。
在 hibernate-4 下,它看起来像:
createdDate: "2014-09-15",
经过以上改动,现在看起来像这样:
createdDate: 1410753600000,
class 注释如下所示:
@Temporal(TemporalType.DATE)
@Column(columnDefinition="datetime")
private Date createdDate;
table 架构在 mysql 上,其列示如下:
| createdDate | datetime | YES | MUL | NULL | |
其中 "Date" 是 java.util.Date。是的,我知道 java.util.Date 很糟糕。我也知道@Temporal 落后于 java 8 和新功能。我们使用 jodatime 并将寻求标准化新的 J8 约定,但这是一个旧的应用程序,这是一个更旧的数据库的中央 table。
我尝试了多种解决方案,包括:
- 合并依赖关系
- 隔离依赖项(我们现在所在的位置)
- 全局实施@Converter(打破其他特定日期格式)
- 仅在字段上使用所述@Converter(仍在获取纪元时间)
- 使用输出 json 映射器设置字段(因为每个 time/date 最终都具有该格式而中断)
- 将基本类型转换为 java.sql.Date(Temporal 就是这样做的)。
通过检查更改日志,我找不到任何可以解释此特定更改的内容,更不用说默认行为会发生如此巨大变化的任何原因了。我知道更大的迁移会有所帮助,但我真的只是想使用旧的默认行为,这样我就可以理顺其余的升级,而不必将它们包裹在主要的 code/db 更改中。
有什么想法吗? hibernate升级过很多次了,从来没有遇到过这样的问题。
问题仍然是 @Temporal
在 Hibernate-5 和 JPA 2.2 之间没有得到尊重,所以映射消失了。我有一个虚假的 DTO 返回数据并在该特定字段上强制使用格式化程序,这似乎解决了这个问题。
我目前正在尝试更新我们当前的一些库,但遇到了阻塞问题。这是一个遗留应用程序,这里是基本设置:
Java 8
Tomcat 7
Mysql 5.5.27-28.1-log Percona Server
Spring 4.2.4.RELEASE
相关的 Hibernate 版本在这里:
55:HIBERNATE_VERSION = "4.3.11.Final"
236: "org.hibernate:hibernate-core:jar:#{HIBERNATE_VERSION}",
239: "org.hibernate:hibernate-envers:jar:#{HIBERNATE_VERSION}",
241: "org.hibernate:hibernate-entitymanager:jar:#{HIBERNATE_VERSION}",
更新版本为:
HIBERNATE_VERSION = "5.2.12.Final"
我不会告诉你细节,但还有很多其他依赖项。我逐渐消除了所有其他更改(包括相关的 spring 更新),但上面列出的库是仅有的 3 个正在更改的库。
现在,由于日期格式已更改,其中一个前端客户端令人窒息。
在 hibernate-4 下,它看起来像:
createdDate: "2014-09-15",
经过以上改动,现在看起来像这样:
createdDate: 1410753600000,
class 注释如下所示:
@Temporal(TemporalType.DATE)
@Column(columnDefinition="datetime")
private Date createdDate;
table 架构在 mysql 上,其列示如下:
| createdDate | datetime | YES | MUL | NULL | |
其中 "Date" 是 java.util.Date。是的,我知道 java.util.Date 很糟糕。我也知道@Temporal 落后于 java 8 和新功能。我们使用 jodatime 并将寻求标准化新的 J8 约定,但这是一个旧的应用程序,这是一个更旧的数据库的中央 table。
我尝试了多种解决方案,包括:
- 合并依赖关系
- 隔离依赖项(我们现在所在的位置)
- 全局实施@Converter(打破其他特定日期格式)
- 仅在字段上使用所述@Converter(仍在获取纪元时间)
- 使用输出 json 映射器设置字段(因为每个 time/date 最终都具有该格式而中断)
- 将基本类型转换为 java.sql.Date(Temporal 就是这样做的)。
通过检查更改日志,我找不到任何可以解释此特定更改的内容,更不用说默认行为会发生如此巨大变化的任何原因了。我知道更大的迁移会有所帮助,但我真的只是想使用旧的默认行为,这样我就可以理顺其余的升级,而不必将它们包裹在主要的 code/db 更改中。
有什么想法吗? hibernate升级过很多次了,从来没有遇到过这样的问题。
问题仍然是 @Temporal
在 Hibernate-5 和 JPA 2.2 之间没有得到尊重,所以映射消失了。我有一个虚假的 DTO 返回数据并在该特定字段上强制使用格式化程序,这似乎解决了这个问题。