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

sam*_*amz 17 java mysql timezone timestamp hibernate

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

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

我找到了" 如何使用JPA和Hibernate以UTC时区存储日期/时间和时间戳 ",这些信息很丰富,但缺少一些我很难找到的最终实现信息.

我想实现一个UtcTimestampTypeDescriptor,如该线程所示,并配置hibernate使用它而不是正常的TimestampTypeDescriptor.

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

Dan*_*anJ 19

实现自定义Hibernate类型的替代方法是将以下JDBC选项添加到JDBC连接URL:

useTimezone=true
serverTimezone=UTC
Run Code Online (Sandbox Code Playgroud)

这将强制您的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>
            ...
Run Code Online (Sandbox Code Playgroud)


Ily*_*lya 3

public class UtcTimestampType extends TimestampType您的链接获取课程
并制作此代码

@org.hibernate.annotations.Type(type = "yourPackage.UtcTimestampType")   
public java.util.Date date;    
Run Code Online (Sandbox Code Playgroud)

使用注释

或者

<property name="date" column="yourColumn" type="yourPackage.UtcTimestampType" />  
Run Code Online (Sandbox Code Playgroud)

使用 *.hbm.xml

  • 我不想注释我拥有的每个日期/时间戳属性。我希望 hibernate 始终使用 UTCTimestampType 而不是默认类型。 (2认同)