休眠强制时间戳以保留/加载为 UTC

2022-09-03 01:23:16

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

我希望休眠使用UTC时区保存/加载这些时间戳对象,而不管系统/java/ mysql时区如何。

我发现“ 如何使用JPA和Hibernate在UTC时区存储日期/时间和时间戳 ”这是信息丰富的,但缺乏一些最终的实现信息,我很难找到。

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

如何将休眠配置为使用 Utc 时间戳类型而不是默认时间戳类型?


答案 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>
            ...

答案 2

您的链接
中获取类并制作此代码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