Hibernate强制时间戳以持续/加载为UTC

时间:2012-03-22 13:38:13

标签: java mysql hibernate timezone timestamp

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

我希望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类型?

2 个答案:

答案 0 :(得分:19)

仅限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>
            ...

答案 1 :(得分:3)

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