Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate使用java.sql.Date是否错误?_Java_Mysql_Hibernate_Jdbc_Time - Fatal编程技术网

Hibernate使用java.sql.Date是否错误?

Hibernate使用java.sql.Date是否错误?,java,mysql,hibernate,jdbc,time,Java,Mysql,Hibernate,Jdbc,Time,我在这里接触社区是因为我发现Hibernate有问题,或者我不知道如何使用java.sql.Date和java.time.LocalDate 我遇到了一个问题,我的DB在UTC时区,而我的客户在EST。我在数据库中有一个名为ETA的字段,类型为DATE,例如在记录上设置为2019-09-10。当我在EST中读取日期时,它变为2019-09-09。文档中的DATE字段没有时区信息 当Hibernate读取该值时,它使用该类。但是,该类的问题是,它将首先尝试将值读取为java.sql.Date(在r

我在这里接触社区是因为我发现Hibernate有问题,或者我不知道如何使用
java.sql.Date
java.time.LocalDate

我遇到了一个问题,我的DB在UTC时区,而我的客户在EST。我在数据库中有一个名为
ETA
的字段,类型为
DATE
,例如在记录上设置为
2019-09-10
。当我在EST中读取日期时,它变为
2019-09-09
。文档中的
DATE
字段没有时区信息

当Hibernate读取该值时,它使用该类。但是,该类的问题是,它将首先尝试将值读取为
java.sql.Date
(在
rs.getDate(name)
部分中),然后调用
javaTypeDescriptor.wrap()
部分,它的实现很差,因为它去掉了时区偏移信息,只是简单地返回了一个日期。这使得
2019-09-09T20:00:00.000-0400
(即数据库中的
2019-09-10
)变为
2019-09-09
,不包含时区偏移部分

我认为问题是Hibernate调用<代码> R.GETDATE()/Cux>的部分,因为它必须返回<代码> java .sql。现在,MySQL驱动程序

publicLocalDate getLocalDate(intColumnIndex)
来获取
LocalDate
,所以我不明白Hibernate为什么不使用这个方法

我发现有人,但他们似乎不认为这是一个问题。< / P> 因此,我想了解一下Hibernate是否存在缺陷,或者我只是不知道如何在
DATE
(DB)和
LocalDate
(Java)类型之间进行转换


注:我使用最新的Hibernate 5.4.5和最新的JPA 2.2。

尝试Hibernate 5和配置选项
Hibernate.jdbc.time\u zone
。这是强制它使用JDBCAPI的正式方式,JDBCAPI使用
UTC
时区中的
Calendar
实例

也就是说,我发现这方面存在很多问题。JDBC驱动程序和使用数据库的人常常会犯下微妙的错误。这就是为什么我们最终放弃了,只把毫秒(UTC)放到数据库中。因此,对于所有三种时态类型,列类型总是
NUMBER(16)

这使我们能够编写特殊的转换器,返回可预测的结果,独立于JDBC驱动程序、数据库/虚拟机/操作系统时区


程序员可以集中精力去理解为什么时区不能按他们认为应该的方式工作:-)

JDBC没有提供
getLocalDate
方法。MySQL拥有它的事实是一个特定于实现的东西。Hibernate无法使用它。相反,它应该使用
getObject(index/name,LocalDate.class)
@markrottevel也许你应该回答你的评论,这样这个问题就可以被标记为已解决。相关:@BasilBourque我故意作为评论发布,因为我认为它没有回答这个问题。JDBC指定getOjbect(int,class)接受LocalDate作为第二个参数@MarkRotterVeel,我想您知道JDBC EG不再添加特定于类型的getXXX和setXXX方法。所有新类型都将使用通用的getObject(int,Class)和setObject(int,Object,SQLType)方法。JDBC规范特别指出,这些方法支持LocalDate、LocalTime、LocalDateTime和OffsetDateTime。不需要任何特定于实现的方法。我添加这样的方法只是让人困惑。嗨,Aaron,我确实在使用Hibernate 5,特别是
5.4.5
,和JPA
2.2
。我很确定我试过设置
hibernate.jdbc.time\u zone
,但没有成功。我将投票支持您的答案,支持您使用列类型
NUMBER(16)
的建议。我在其他几个地方看到过这一建议,认为这是使用日期类型的一个很好的替代方法。