Hibernate使用java.sql.Date是否错误?
我在这里接触社区是因为我发现Hibernate有问题,或者我不知道如何使用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
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
,和JPA2.2
。我很确定我试过设置hibernate.jdbc.time\u zone
,但没有成功。我将投票支持您的答案,支持您使用列类型NUMBER(16)
的建议。我在其他几个地方看到过这一建议,认为这是使用日期类型的一个很好的替代方法。