我有一个实体,该实体的字段定义如下:
@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
我建议您使用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 {
// ...
}
这不是直接的答案,但是如果您在开发过程的开始阶段,使用LocalDateTime而不是旧的Date对象可能会很有用。在这种情况下,不再需要使用TemporalType.TIMESTAMP。