gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:15:11 24 4
gpt4 key购买 nike

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

@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 | |
+---------------+--------------+------+-----+---------+-------+

我想我需要向 @Column 注释添加一个 columnDefinition 参数,但为什么 Hibernate 没有自动完成它,因为我明确告诉我我想要表支持的时间戳。

我尝试了上面的方法:
- 10.1.14 - MariaDB
- 5.7.29 - MySQL

Hibernate 版本为 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)" );
// ...
}
}

但是 MySQL5InnoDBDialectMySQLDialect 继承了 Types.TIMESTAMP 声明,它以下列方式声明:

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 {
// ...
}

关于java - Hibernate Temporal.TIMESTAMP 映射到没有毫秒的 mysql 日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60815137/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com