Hibernate Temporal.TIMESTAMP映射到没有毫秒的mysql日期时间

问题描述 投票:3回答:2

我有一个实体,该实体的字段定义如下:

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

我假设Hibernate将创建一个具有DATETIME(3)类型的对应列的表(对于MySQL),但是该表的列只是一个DATETIME,所以当我以毫秒存储一个Date时,它们会丢失:

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

休眠版本为5.2.18.Final,带有MySQL5InnoDBDialect

java hibernate
2个回答
3
投票

我建议您使用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)" );
    // ...
  }
}

但是MySQL5InnoDBDialectTypes.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
投票

这不是直接的答案,但是如果您在开发过程的开始阶段,使用LocalDateTime而不是旧的Date对象可能会很有用。在这种情况下,不再需要使用TemporalType.TIMESTAMP

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

© www.soinside.com 2019 - 2024. All rights reserved.