2013-04-19 1 views
3

Я обновил сервер MySQL 5.1 до 5.6. После этого я испытываю странное поведение DATETIME (спящий тип timestamp). По какой-то причине мои даты меняются от (например) '2012-09-30 23:59:59' до '2012-10-1 00:00:00' после сохранения объекта спящего спящего режима. В моем журнале говорится, что я действительно сохраняю одну секунду до полуночи, но когда я смотрю на базу данных, она изменилась на начало следующего дня. Если я делаю запрос INSERT с той же датой, он работает без проблем.Странное поведение DATETIME с Hibernate и MySQL 5.6

Согласно документации MySQL не должно быть никаких преобразований в часовом поясе с DATETIME. Я также тестировал с MySQL 5.5, и я не мог воспроизвести ту же проблему.

Мое отображение HBM выглядит следующим образом:

<composite-id> 
    ... 
    <key-property name="timestamp" type="timestamp" column="timestamp"/> 
</composite-id> 

EDIT: У меня также есть последний драйвер JDBC для MySQL.

РЕДАКТИРОВАТЬ 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: Проблема воспроизведена в версиях спящего режима 3.3.1 и 4.1.9.

ответ

5

Я думаю, что нашел ответ. Дата, которую я использовал, включала миллисекунды, и кажется, что в MySQL 5.6 вы должны определить точность для DATETIME. Без определения количества дробных десалимов он по умолчанию равен 0. В этом случае «2013-04-01 23: 59: 59,500» раундов до «2013-04-02 00:00:00». Мне удалось воспроизвести это с помощью SQL-запроса, поэтому он не имеет ничего общего с Java или Hibernate.

http://dev.mysql.com/doc/refman/5.6/en/fractional-seconds.html

Я изменил строку в мой код из

calendar.set(GregorianCalendar.MILLISECOND, 999); 

в

calendar.set(GregorianCalendar.MILLISECOND, 0); 

и проблема ушла.

Смежные вопросы