java - hibernate 强制时间戳以保持/加载为 UTC

标签 java mysql hibernate timezone timestamp

我正在使用 java、mysql、hibernate (3.6.x)。 在 java 方面,我使用 java.sql.Timestamp 对象。 在 mysql 方面,我使用的是日期时间列。

我希望 hibernate 使用 UTC 时区保存/加载这些 Timestamp 对象,而不考虑系统/java/mysql 时区。

我找到了“How to store date/time and timestamps in UTC time zone with JPA and Hibernate”,它提供了丰富的信息,但缺少一些我正在努力寻找的最终实现信息。

我想实现一个 UtcTimestampTypeDescriptor,如该线程中所示,并将 hibernate 配置为使用它而不是普通的 TimestampTypeDescriptor。

如何将 hibernate 配置为使用 UtcTimestamp 类型而不是默认的 Timestamp 类型?

最佳答案

仅适用于 MySQL,实现自定义 Hibernate 类型的替代方法是将以下 JDBC 选项添加到您的 JDBC 连接 URL:

useTimezone=true
serverTimezone=UTC

这将强制您的 JDBC 连接进入 UTC 时区,并要求 MySQL 从 JVM 时区执行转换。最终效果是您可以在 JVM 上保留本地时区(例如,用于打印日志消息等),而 DATETIME 列将保留为 UTC。

例如:

<bean id="hibernateAnalysisSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="hibernateProperties">
        <props>
            <!-- Connection parameters -->
            <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
            <prop key="hibernate.connection.url">jdbc:mysql://hostname/databaseName?useTimezone=true&amp;serverTimezone=UTC</prop>
            ...

关于java - hibernate 强制时间戳以保持/加载为 UTC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9823411/

相关文章:

java - 使用 get 和 set 传递数据

php - "Caching"所有用户的相同 MySQL 结果

php - 我正在处理 SQL 查询,但没有处理完全外连接

java - 将字节写入 java 套接字

java - 使用 REGEX 进行字符串验证

java - 为什么我得到 MappingNotFound 异常

hibernate - 使用 Hibernate 3.6.3 和 JPA 2.0 创建类型化查询时出现 AbstractMethodError

hibernate - 使用 hibernate 将 blob 保存到数据库

java - 获取Excel文件中单元格的超链接

php - Cakephp IN 条件绕过重复 ID 来获取数据