【问题标题】:WildFly Timezone with JPA带有 JPA 的 WildFly 时区
【发布时间】:2018-10-12 05:41:39
【问题描述】:

我目前正在使用 Hibernate 和 WildFly 开发一个项目。我使用的数据库是 mariaDB。

当我将java.time.Instant 插入数据库时​​,JPA 对插入的时间戳应用两个小时(在 java 代码中始终为 UTC)。

我尝试在standalone.conf (Java Opts) 和命令行参数中使用-Duser.timezone=UTC 启动WildFly。管理控制台显示了这个时区,但所有日志输出和数据库输入都在我的系统时区 (+2) 中。当我将 Windows 时区设置为 UTC 时,奇怪的行为停止并且数据库中的时间是正确的。

我还尝试设置休眠属性 <property name="hibernate.jdbc.time_zone" value="UTC"/> 和我的 mariaDB SET GLOBAL time_zone = "+00:00",但效果不佳。

我在这里缺少什么?

【问题讨论】:

  • 假设您在数据库中使用timestamp 类型,很可能正在为连接设置 session 时区。请参阅文档中的 Connection Time Zones
  • 这应该用 jbdc.time_zone 修复 - 这也不起作用......

标签: hibernate jpa timezone mariadb wildfly


【解决方案1】:

如果您想确保您的 Java 应用程序始终是 UTC,您应该在应用程序启动时覆盖 JVM 时区。

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

来源

How do I programmatically set the time zone in Java?

通过这样做,您将覆盖部署服务器的任何其他奇怪的时区配置,我的理解是您在这里期望的行为。

此代码应添加到应用程序启动中。这取决于您使用的框架。

对于 JEE5+,您可以创建单例 boostrap EJB:

@Singleton
@Startup
public class StartupBean {

    @PostConstruct
    private void startup() {
        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    }
}

对于 Springboot 1.5+,你可以在任何地方创建一个钩子:

@EventListener(ApplicationReadyEvent.class)
public void doSomethingAfterStartup() {
    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
}

【讨论】:

  • 我刚刚尝试了带有 Singleton 和 StartupBean 的版本,它不起作用。同样,数据库中的所有时间都偏移了两个小时,而不是 UTC。 ://
  • 好的,让我们承认 jvm 和 db 都正确设置为 UTC。问题可能来自用户输入:它在 db 中存储的时间是少了 2 小时还是多了 2 小时?用户输入来自 JSP/JSF 还是 REST API?
  • 它在我系统的时区中存储了 +2 小时。但是,我认为这是一个与 Hibernate 相关的错误,因此我在那里打开了一个错误:hibernate.atlassian.net/browse/HHH-12578
【解决方案2】:

所以这个问题的答案很简单。

我使用了带有 WildFly12 的 Hibernate 版本 - 即 5.1.10。根据Chris Cranford

hibernate.jdbc.time_zone 设置直到 5.2.3 才引入

虽然这里的任何子系统都没有抛出错误。更新您的 Hibernate 即可解决问题。

  1. 进入wildfly-12.0.0.Final\modules\system\layers\base\org\hibernate\main
  2. 下载coreenvers库并放入文件夹。
  3. 修改 module.xml 并更新版本并删除 -java8-* 和 entitymanger-*.jar -> 它们已被弃用并移至核心。
  4. 重新启动 WildFly,您的问题就会消失。

WildFly 团队没有使用较新的 Hibernate 版本可能是有充分理由的,但我不确定为什么。因此,交换的库可能存在一些错误/不需要的行为。

实际上,属性未知的简单错误消息可以为我节省一些时间。要么我没有在日志中找到它,要么它不是一个错误......

【讨论】:

    猜你喜欢
    • 2015-06-11
    • 2020-02-22
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 2012-11-01
    相关资源
    最近更新 更多