gpt4 book ai didi

java - Hibernate 在绑定(bind)到 Java 时间戳对象时忽略数据库时区信息

转载 作者:搜寻专家 更新时间:2023-10-31 20:08:39 27 4
gpt4 key购买 nike

我在 Oracle 中存储了一些日期,数据类型为 Oracle 的 TIMESTAMP(3)。现在我正在编写一个 Spring Boot 应用程序来读取这些值。代码如下:

HibernateCallback callback = new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
Query query = session.createSQLQuery("SELECT date_field FROM some_table WHERE some_conditions");

return query.list();
}
};

所以:

List results = (List)getHibernateTemplate().execute(callback);
// suppose there's only one row and one column returned
Timestamp ts = result.get(0)[0];

返回由 Hibernate 自动创建的 Java Timestamp 对象。问题在于,在构造对象时,它忽略了 Oracle 中存储的时区,而是使用 JVM 的默认时区。我测试是通过给JVM设置不同的时区,每次生成不同的时间戳。

这显然是错误的。日期在时间线上应该是唯一的。它不应该依赖于 JVM 的时区。我想知道在解析日期时包含数据库时区信息的正确方法是什么。现在看来它只是使用存储在 Oracle 中的字符串表示形式并使用 JMV 的时区对其进行解析。我正在使用 Hibernate 4.3.4.Final

PS:实际查询是高度自定义的,所以我必须编写原始 SQL。

最佳答案

基本上,这甚至不是 Hibernate 的问题,而是 JDBC 的问题。默认情况下,JDBC 驱动程序将使用运行 JVM 的系统时区。如果您在不同的时区连接到数据库服务器,或者即使您想要独立于系统的当前时区,明确设置 JDBC 时区也是一个好主意。您可以使用 hibernate.jdbc.time_zone 属性设置时区或在运行时通过。

session = sessionFactory.withOptions()
.jdbcTimeZone(TimeZone.getTimeZone("UTC"))
.openSession();

同样对于 Oracle,我会说您可以使用 TIMESTAMP WITH LOCAL TIME ZONE,它会尊重您的 JDBC 客户端时区。

关于java - Hibernate 在绑定(bind)到 Java 时间戳对象时忽略数据库时区信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48758386/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com