我有一个实体,该实体的字段定义如下:
@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
答案 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 。