gpt4 book ai didi

java - MySQL DATETIME 精度(joda-time、Hibernate、org.jadira.usertype、hbm2ddl)

转载 作者:可可西里 更新时间:2023-11-01 07:02:36 26 4
gpt4 key购买 nike

在我的 hibernate-4 实体中,我正在映射一个 joda-time DateTime使用推荐的属性 jadira usertypes :

@Entity
@Table(name="timing")
public class TimingEntity {
...
@Basic(optional=false)
@Column(name="moment")
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
public DateTime getMoment() {
...

我的数据库是 MySQL。将 hibernate 属性 hbm2ddl.auto 设置为 create 值后,我的 timing 表中生成了以下列:

CREATE TABLE `timing` (
...
`moment` DATETIME NOT NULL,
...
)

生成的 CREATE TABLE 包含 DATETIME 列。 MySQL 中的 DATETIME 只有秒精度,没有小数部分。为了启用小数部分,最多微秒,MySQL 5.6.4 及更高版本 enables DATETIME(precision) 列,例如 DATETIME(3) 具有毫秒精度。

我的问题是——有没有办法为我用 hbm2ddl 生成的时间场指定精度?至少,这是 jadira 用户类型、java.sql 或 jdbc 驱动程序机制的问题吗?

P.S. 当我手动修改 DB 表以获得我想要的精确列精度时,比如 DATETIME(3),一切正常 - joda DateTimes 被写入并且以毫秒精度从数据库中读取。

最佳答案

我发现了另一种解决方案,允许不在您的 @Column 中硬编码 MySQL 列定义片段注解。通过覆盖 org.hibernate.dialect.MySQLDialect 定义您自己的 hibernate 方言:

package org.yourproject;

import java.sql.Types;
import org.hibernate.dialect.MySQL5Dialect;

public class MySQL564PlusDialect extends MySQL5Dialect {
public MySQL564PlusDialect() {
super();
registerColumnType( Types.TIMESTAMP, 6, "datetime($l)" );
}
}

并将其指定为 hibernate 属性 hibernate.dialect=org.yourproject.MySQL564PlusDialect (您想要扩展的方言可能会有所不同,例如 org.hibernate.dialect.MySQL5InnoDBDialect)。

现在您可以调整 DATETIME 的精度来自内部@Column使用 length 注释属性:

@Basic(optional=false)
@Column(name="moment", length=3)
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
public DateTime getMoment() {
...

这将产生 DATETIME(3)列定义意味着毫秒精度。如果您需要简单的 DATETIME (没有小数秒),只是不指定长度。您可以使用 length 的值最多 6,这意味着微秒精度。

如果您碰巧使用与上述方言不同的方言(例如标准 org.hibernate.dialect.MySQLDialect 或其他数据库),这不会破坏您的代码:length @Column 上的属性将被忽略。

附言利用 precision 会更明智@Column 的属性而不是 length , 但简单替换 "datetime($l)"图案与 "datetime($p)"一个在我自己的方言实现中不能立即工作。

关于java - MySQL DATETIME 精度(joda-time、Hibernate、org.jadira.usertype、hbm2ddl),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22785117/

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