休眠强制时间戳以 UTC 形式持续/加载 [重复]

Posted

技术标签:

【中文标题】休眠强制时间戳以 UTC 形式持续/加载 [重复]【英文标题】:Hibernate force timestamp to persist/load as UTC [duplicate] 【发布时间】:2012-04-07 01:56:44 【问题描述】:

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

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

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

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

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

【问题讨论】:

为什么不尝试实现community.jboss.org/wiki/UserTypeForNon-defaultTimeZone,然后提出具体问题。 我不想实现一个简单的用户类型并注释每个日期/tiemstamp 属性。相反,我想实现一个描述符并将其注册到休眠状态而不是默认的 timstamp 描述符。具体的问题是我在哪里用hibernate注册这个类型,所以它会替换默认的? ***.com/questions/4725719/hibernate-typeresolver 我尝试实现上述链接,它可以追溯到大约 2007 年的 Hibernate 3 早期版本,其 API 在 JPA 2 和 Hibnerate 4.x 下已经完全改变。该实现存在许多问题,使其完全不兼容。 【参考方案1】:

仅适用于 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>
            ...

【讨论】:

成功了!非常感谢:D【参考方案2】:

从your link获取类public class UtcTimestampType extends TimestampType 并制作此代码

@org.hibernate.annotations.Type(type = "yourPackage.UtcTimestampType")   
public java.util.Date date;    

使用注释

<property name="date" column="yourColumn" type="yourPackage.UtcTimestampType" />  

使用 *.hbm.xml

【讨论】:

我不想注释我拥有的每个日期/时间戳属性。我希望休眠始终使用 UTCTimestampType 而不是默认类型。 不可能。 UTCTimestampType 是自定义用户类型。如果你愿意,你可以解压 Hibernate 的库并破解它。 查看该示例,查看 hibernate 3.6 示例。有一个描述符的例子,而不是一个类型。然后它说当应用程序启动时,您可以注册这种类型而不是默认类型,但它没有说明如何/在哪里......这基本上是我的问题。 你可以这样做,使用 class Configuration cfg = new Configuration().configure("your.cfg.xml"); cfg.registerTypeOverride(new UtcTimestampType()); 我按照你的方法使用了注解,但是休眠似乎忽略了 UtcTimestampType,为什么? (甚至没有命中调试器断点)我有 Hibernate 3.6.10

以上是关于休眠强制时间戳以 UTC 形式持续/加载 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

强制 Java 时区为 GMT/UTC

如何放置时间戳以使其在保存时不会重复

创建PHP时间戳以插入mysql数据库[重复]

python time

13python time时间模块知识点备查

尝试加载 gem 'devise. ActiveSupport:持续时间不能强制转换为整数