绑定到Java时间戳对象时,Hibernate忽略数据库时区信息
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了绑定到Java时间戳对象时,Hibernate忽略数据库时区信息,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1401字,纯文字阅读大概需要3分钟。
内容图文
我有一些日期存储在Oracle中,Oracle的TIMESTAMP(3)作为其数据类型.现在我正在编写一个Spring启动应用程序来读取这些值.代码如下:
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的时区.我想知道在解析日期时包含DB的时区信息的正确方法是什么.现在看起来它只是使用存储在Oracle中的String表示并用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忽略数据库时区信息全部内容,希望文章能够帮你解决绑定到Java时间戳对象时,Hibernate忽略数据库时区信息所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。