【发布时间】:2016-12-18 21:51:41
【问题描述】:
我们正在进行一个升级我们的 OSGi 服务器应用程序的项目:
- 卡拉夫 2.3.1
- OSGi 核心 4.3.0
- 休眠 3.4.0 正式版
- Spring(包括 SpringDM)3.2.2.RELEASE
- c3p0 连接池 0.9.1.2
- PostgreSQL 驱动程序 9.1.901
收件人:
- 卡拉夫 4.0.5
- OSGi 核心 6.0.0
- 休眠 5.0.9.Final
- Hikari 连接池 2.4.3
- PostgreSQL 驱动程序 9.4-1204-jdbc42
新版本使用声明式服务而不是 Spring DM。
转换后,我们开始在从数据库中检索日期时遇到问题。任何包含新西兰今年(9 月 25 日)夏令时转换日期的日期都会得到不一致的结果。我们在服务器启动后查询此日期的前 5 次,日期是正确的。但是,之后它会更改为之前的日期。也就是说,如果数据库包含“2016-09-25”,则返回“2016-09-24”。
最初我们认为这是一个 JPA 实体填充问题,但我们现在已将其范围缩小为一个非常简单的原生查询:
em.createNativeQuery("SELECT DATE '2016-09-25'").getResultList()
它在前几次返回一个带有 25 号时间 00:00 的 Date 对象,然后它返回一个带有 24 号时间 11:00 之后的 Date 对象。
奇怪的是,如果我们添加时间,像这样:
em.createNativeQuery("SELECT DATE '2016-09-25 00:00:00'").getResultList()
那么我们总是会得到一个 Date 对象,它是 25 日,时间 00:00。
我们尝试过的:
- 执行简单 JDBC 查询的基本测试程序 - 每次都能正常工作
- Karaf 之外的休眠实体管理器 - 每次都能正常工作
- 2016 年 9 月 25 日以外的日期 - 每次都可以正常工作
我可以理解,无论是否应用夏令时都会产生这些日期值之一。我无法理解的是为什么它不一致。
【问题讨论】:
标签: java postgresql hibernate osgi apache-karaf