Java Hibernate时间戳-毫秒精度

Java Hibernate时间戳-毫秒精度,java,hibernate,mariadb,milliseconds,Java,Hibernate,Mariadb,Milliseconds,似乎hibernate的已知问题是以毫秒精度存储时间戳。 我在数据库中的字段最初设置为时间戳(3),但我也尝试了datetime(3)…不幸的是,它没有任何区别 我尝试过使用时间戳和日期类,最近我开始使用joda时间库。在所有这些努力之后,我仍然无法以毫秒的精度保存时间戳 我的类映射包含以下属性: <property name="startTime" column="startTime" type="org.jadira.usertype.dateandtime.joda.Persi

似乎hibernate的已知问题是以毫秒精度存储时间戳。 我在数据库中的字段最初设置为时间戳(3),但我也尝试了datetime(3)…不幸的是,它没有任何区别

我尝试过使用时间戳和日期类,最近我开始使用joda时间库。在所有这些努力之后,我仍然无法以毫秒的精度保存时间戳

我的类映射包含以下属性:

<property name="startTime" column="startTime"    type="org.jadira.usertype.dateandtime.joda.PersistentDateTime" length="3" precision="3" />
如果我手动将数据输入到数据库中,hibernate将设法检索次秒级的部分


有什么方法可以解决这个问题吗?

您是否有可能在MariaDB 5.5中使用MySQL连接器/J JDBC驱动程序

连接器/J通常仅在检测到服务器足够新时才将毫秒部分发送到服务器,并且此检测检查服务器版本是否>=5.6.4。这显然不适用于MariaDB 5.5.x

您可以在此处看到Connector/J source的相关部分:


使用MariaDB自己的JDBC驱动程序(MariaDB Java Client)可能会有所帮助(我没有尝试过),但我意外地发现,在连接字符串中添加useServerPrepStmts=true也可以使用Connector/J实现这一点。

我从未尝试过您尝试的方法。。。为什么不将历元(UTC)转换为毫秒,然后将其存储为long?大多数情况下,转换不会真正发生,因为许多计时对象从epoch开始就以毫秒为单位工作。这将是最好的解决方案,但数据库被其他应用程序使用,更改模式将对这些应用程序产生巨大影响。我通过执行本机sql查询来保存这些数据,暂时解决了这个问题。我看到的唯一问题是,我的代码现在依赖于数据库。我使用的是MySQL JDBC Connector/J,但服务器运行的是MariaDB 10.0.7。连接器/J也没有问题,因为执行本机SQL查询是有效的。这与hibernate本身有关。使用useServerPrepsmts=true为我解决了这个问题。MySQL连接器/jdbc5.1.34.5
public class MySQLQustomDialect extends MySQL5InnoDBDialect{
    protected void registerColumnType(int code, String name) {
        if (code == Types.TIMESTAMP) {
            super.registerColumnType(code, "TIMESTAMP(3)");
        } else {
            super.registerColumnType(code, name);
        }
    }
}