Hibernate Temporal.TIMESTAMP отображается на mysql datetime без миллис - PullRequest
3 голосов
/ 23 марта 2020

У меня есть объект с полем, определенным следующим образом:

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "some_datetime")
private java.util.Date someDateTime;

Я бы предположил, что Hibernate создаст таблицу с соответствующим столбцом типа DATETIME(3) (для MySQL), однако таблица столбец это просто DATETIME, поэтому, когда я сохраняю дату с миллисекундами, они теряются:

describe some_table;
+---------------+--------------+------+-----+---------+-------+
| Field         | Type         | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+-------+
| ...           | ...          | NO   | PRI | NULL    |       |
| some_datetime | datetime     | YES  |     | NULL    |       |
| ...           | ...          | NO   |     | NULL    |       |
+---------------+--------------+------+-----+---------+-------+

Я думаю, мне нужно добавить параметр columnDefinition в аннотацию @Column, но почему это не выполняется автоматически Hibernate, так как я явно сказал, что хочу иметь TIMESTAMP, поддерживаемый таблицей.

Я пробовал выше с:
- 10.1.14 - MariaDB
- 5.7.29 - MySQL

Версия Hibernate: 5.2.18.Final с MySQL5InnoDBDialect

Ответы [ 2 ]

3 голосов
/ 23 марта 2020

Я бы предложил вам использовать org.hibernate.dialect.MySQL57Dialect диалект вместо org.hibernate.dialect.MySQL5InnoDBDialect.

Как я вижу, тип Types.TIMESTAMP переопределен здесь как datetime(6)

public class MySQL57Dialect extends MySQL55Dialect {
  public MySQL57Dialect() {
    super();
    registerColumnType( Types.TIMESTAMP, "datetime(6)" );
    // ...
  }
}

Но MySQL5InnoDBDialect унаследовал декларацию Types.TIMESTAMP от MySQLDialect, где он объявлен следующим образом:

public class MySQLDialect extends Dialect {
  public MySQLDialect() {
    // ..
    registerColumnType( Types.TIMESTAMP, "datetime" );
  }
}

И, кстати, этот диалект помечен как устаревший:

/** A Dialect for MySQL 5 using InnoDB engine
 *  ...
 * @deprecated Use "hibernate.dialect.storage_engine=innodb" environment variable or JVM system property instead.
 */
@Deprecated
public class MySQL5InnoDBDialect extends MySQL5Dialect {
   // ...
}

1 голос
/ 23 марта 2020

Это не прямой ответ, но если вы в начале процесса разработки, возможно, будет полезно использовать LocalDateTime вместо старого Date объекта. В этом случае больше нет необходимости использовать TemporalType.TIMESTAMP .

https://www.baeldung.com/hibernate-date-time

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...