从hibernate-4迁移到hibernate-5

时间:2018-02-02 23:36:42

标签: migration hibernate-4.x hibernate-5.x java.util.date mysql-5.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"

我会为您省去细节,但还有其他一些依赖项。我逐渐消除了所有其他变化(包括相关的弹簧更新),但上面列出的库是唯一正在变化的3个。

现在,其中一个前端客户端因为日期格式发生变化而窒息。

在hibernate-4下,它看起来像:

  

createdDate:“2014-09-15”,

通过上述更改,现在看起来像这样:

  

createdDate:1410753600000,

班级注释如下所示:

@Temporal(TemporalType.DATE)
@Column(columnDefinition="datetime")
private Date createdDate;

表模式在mysql上,它的列表如下:

  

| createdDate | datetime |是的| MUL | NULL | |

其中“Date”是java.util.Date。是的,我理解java.util.Date太可怕了。我也知道@Temporal落后于java 8和新功能。我们使用jodatime,并希望标准化新的J8约定,但这是一个旧的应用程序,这是一个更老的数据库的中央表。

我尝试了很多解决方案,包括:

  • 合并依赖关系
  • 隔离依赖关系(我们现在所处)
  • 全局实施@Converter(打破其他特定日期格式)
  • 仅在场上使用@Converter(仍然获得纪元时间)
  • 使用输出json映射器设置字段(因为每次/日期最终都具有该格式,所以会中断)
  • 将基本类型转换为java.sql.Date(就像Temporal所做的那样)。

通过检查更改日志,我找不到任何可以解释此特定更改的内容,更不用说任何原因默认行为会发生如此剧烈的变化。我知道更大的迁移可以提供帮助,但我真的只是想使用旧的默认行为,这样我就可以理顺其余的升级,而不会让它们在主要的代码/数据库更改中完成。

这里有什么想法吗?我之前已多次升级hibernate并且从未遇到过这样的问题。

1 个答案:

答案 0 :(得分:0)

问题仍然是@Temporal Hibernate-5和JPA 2.2之间没有被尊重,因此映射消失了。我有一个虚假的DTO返回数据并在该特定字段上强制使用格式化程序,这似乎解决了这个问题。