hibernate mysql5.6_使用Hibernate和MySQL 5.6的奇怪的DATETIME行为

在升级MySQL 5.1到5.6后,作者发现使用Hibernate保存的DATETIME类型字段会自动跳到下一日期。即使在午夜前保存,数据库中显示的时间也会变成次日00:00:00。通过查看日志和尝试插入操作,确认问题与MySQL 5.6有关,而不是代码或其它版本的MySQL。最终,发现原因是MySQL 5.6中DATETIME默认精度为0,包含毫秒的日期会被四舍五入导致时间变化。解决方案是确保设置时间为整秒,避免使用毫秒。
摘要由CSDN通过智能技术生成

我将MySQL 5.1社区服务器更新为5.6.在此之后,我遇到了奇怪的DATETIME(休眠类型时间戳)行为.出于某种原因,在保存hibernate映射对象后,我的日期从(例如)’2012-09-30 23:59:59’变为’2012-10-1 00:00:00′.我的日志说我确实在午夜之前保存了一秒钟,但是当我查看数据库时它已经改为第二天的开头.如果我使用相同的日期创建一个INSERT查询它没有问题.

根据MySQL文档,不应该使用DATETIME进行任何时区转换.我还测试了MySQL 5.5,我无法重现同样的问题.

我的hbm映射看起来像这样:

...

编辑:我也有最新的MySQL jdbc驱动程序.

编辑2:你可以看到日期的变化.

22.04.13 12:04:54.149 DEBUG SQL:104 - insert into data_table (col_1, col_2, timestamp) values (?, ?, ?)

22.04.13 12:04:54.149 TRACE BasicBinder:83 - binding parameter [1] as [DOUBLE] - 1.0

22.04.13 12:04:54.149 TRACE BasicBinder:83 - binding parameter [2] as [INTEGER] - 1

22.04.13 12:04:54.150 TRACE BasicBinder:83 - binding parameter [3] as [TIMESTAMP] - Mon Apr 22 23:59:59 EEST 2013

22.04.13 12:04:54.151 ERROR SqlExceptionHelper:144 - Duplicate entry '1-2013-04-23 00:00:00' for key 'PRIMARY'

编辑3:使用Hibernate版本3.3.1和4.1.9重现问题.

解决方法:

我想我找到了答案.我使用的日期包括毫秒,似乎在MySQL 5.6中你必须定义DATETIME的准确性.在没有定义小数减数的数量的情况下,它默认为0.在这种情况下,’2013-04-01 23:59:59.500’轮到’2013-04-02 00:00:00′.我设法用sql查询重现这个,所以它与Java或Hibernate无关.

我在代码中更改了一行

calendar.set(GregorianCalendar.MILLISECOND, 999);

calendar.set(GregorianCalendar.MILLISECOND, 0);

问题就消失了.

标签:mysql,hibernate

来源: https://codeday.me/bug/20190517/1122558.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值