5

MySQL 5.1 Community サーバーを 5.6 に更新しました。この後、奇妙な DATETIME (ハイバネート タイプのタイムスタンプ) の動作が発生します。何らかの理由で、休止状態にマップされたオブジェクトを保存した後、日付が (たとえば) '2012-09-30 23:59:59' から '2012-10-1 00:00:00' に変わります。私のログによると、確かに真夜中の日付の 1 秒前を保存していますが、データベースを見ると、次の日の初めに変更されています。同じ日付で INSERT クエリを作成すると、問題なく動作します。

MySQL のドキュメントによると、DATETIME を使用したタイム ゾーン変換は行わないでください。MySQL 5.5 でもテストしましたが、同じ問題を再現できませんでした。

私の hbm マッピングは次のようになります。

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

編集: 最新の MySQL jdbc ドライバーもあります。

EDIT 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 で再現された問題。

4

1 に答える 1

6

私は答えを見つけたと思います。私が使用した日付にはミリ秒が含まれており、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);

そして問題はなくなりました。

于 2013-04-22T11:34:48.330 に答える