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

时间:2020-03-23 14:08:03

标签: java hibernate

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

@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

2 个答案:

答案 0 :(得分: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)" );
    // ...
  }
}

但是MySQL5InnoDBDialect继承了Types.TIMESTAMP的{​​{1}}声明,该声明采用以下方式:

MySQLDialect

并且,顺便说一句,该方言被标记为已弃用:

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

答案 1 :(得分:1)

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

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