MySQL / Hibernate:在插入类型Time上获得值+ 1H

时间:2016-10-05 09:28:03

标签: mysql sql hibernate java-ee time

我正在开发一个使用以下内容的java web项目:

  • Hibernate 5.2.2 / JPA 2.0 + MySQL5InnoDBDialect

  • MySQL 5.6.15 - innoDB(在EasyPHP / PHPMyAdmin上)+ JDBC connector 6.0.4

    < / LI>
  • Joda time API 2.9.4 + Fasterxml jackson API 2.8.3

我在数据库中插入Time数据时遇到问题。每次我排成一排,我在时间栏上得到+ 1H值!

  • Java上的属性:
  

@JsonFormat(shape = JsonFormat.Shape.STRING,pattern =“ HH:mm ”)
  @Column(name =“RES_DUREE”,nullable = false)
   @Temporal (TemporalType。 TIME )私有日期 resDuree;

  • SQL上的属性:
  

RES_DUREE TIME NOT NULL;

编辑(在Adrian Shum的评论之后):

  • 连接线:
  

jdbc.url =   JDBC:MySQL的://本地主机:3306 / MYDB了useUnicode =真安培; useJDBCCompliantTimezoneShift =真安培;的 useLegacyDatetimeCode =假&安培;的 serverTimezone = UTC

我确实使用UTC但它仍然是1H + 任何建议都会有所帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

通常它是由服务器和数据库时区不匹配引起的。

简而言之,java.util.Date不包含时区信息。从概念上讲,您可以将其视为简单表示日期+时间(类似于JODA / JSR310 LocalDateTime正在做的事情)。因此,如果您的应用服务器是UTC + 10,而您的数据库是UTC + 2,那么当您保存日期为&#34; 2016-10-13 10 :11:12&#34;时虽然您的应用服务器将其视为&#34; 2016-10-13 10:11:12 +10:00 &#34;,它只是传递&#34; 2016-10-13 10:11:12&#34;到DB。鉴于DB是UTC + 2,它认为时间实际意味着&#34; 2016-10-13 10:11:12 +02:00 &#34;。如果声称你的JDBC连接是&#34; UTC + 10&#34;则情况变得更加混乱,大多数数据库将会巧妙地&#34;智能地&#34;翻译&#34; 2016-10-13 10 :11:12 + 02 :00&#34;到&#34; 2016-10-13 18 :11:12 + 10 :00&#34;这导致存储和检索奇怪的时间。

您可以通过跟踪相应插入的SQL(以及使用的实际值)进行诊断并选择。您应该看到值与表中存储的值之间存在差异。这种跟踪可以通过misc方式完成,例如

  1. 旧版本的Hibernate可以通过打开正确的记录器
  2. 来显示预备语句中使用的参数
  3. 你可以使用像JdbcDsLog这样的工具(免责声明:我是http://github.com/adrianshum/jdbcdslog的JbdcDsLog分支的维护者)
  4. DBMS端可能有工具来跟踪传入的查询。
  5. 解决的最佳方法是确保所有内容都在同一时区,时区最合理的选择是 UTC