Проблема возникла из-за возможности mysql, я использую mysql 5.7+
, liquibase
с raw sql для генерации схемы.
Если я создаю столбец в mysql с timestamp
, по умолчанию он автоматически обновляется.
mysql> create table test ( a timestamp );
Query OK, 0 rows affected (0.02 sec)
mysql> describe test;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+-------------------+-----------------------------+
| a | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+-------------------+-----------------------------+
1 row in set (0.00 sec)
mysql>
Когда создавалась новая запись, обе отметки времени находились в UTC
часовом поясе, поскольку hibernate
превосходил MySQL.
Но когда обновляется запись, on update current_timestamp
из mysql
срабатывает, в то время как hibernate
ничего не делает, поскольку он @creationTimeStamp
, следовательно, он остается в локальной временной зоне, которую поместил mysql
.
Для разрешения я определил поле как
creation_time timestamp null,
updation_time timestamp null
Теперь mysql
не мешает, обновление и т. Д. Все выполняется только в режиме гибернации.
Если вы находите объяснение немного запутанным и используете mysql
, перейдите к статье, которая прояснится ниже. https://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html
Надеюсь, это кому-нибудь поможет.