17

I'm using java, mysql, hibernate (3.6.x). On the java side I'm using java.sql.Timestamp objects. On the mysql side I'm using datetime columns.

I want hibernate to save/load these Timestamp objects using UTC time zone regardless of system/java/mysql time zone.

I found " How to store date/time and timestamps in UTC time zone with JPA and Hibernate " which was informative but lacking some final implementation info which I'm struggling to find.

I want to implement a UtcTimestampTypeDescriptor as shown in that thread and configure hibernate to use this instead of the normal TimestampTypeDescriptor.

How can I configure hibernate to use the UtcTimestamp type instead of the default Timestamp type?

Community
  • 1
  • 1
samz
  • 1,592
  • 3
  • 21
  • 37
  • 1
    Why don't you try implementing https://community.jboss.org/wiki/UserTypeForNon-defaultTimeZone and then come up with the specific questions. – ManuPK Mar 22 '12 at 14:04
  • I don't want to implement a simple usertype and annotate every date/tiemstamp property. Instead I want to implement a Descriptor and register it in hibernate instead of the default timstamp descriptor. The specific question is where do I register this type with hibernate so it replaces the default one? – samz Mar 22 '12 at 16:42
  • http://stackoverflow.com/questions/4725719/hibernate-typeresolver – samz Mar 25 '12 at 09:51
  • I tried implementing the above link and it traces back to circa 2007 under early versions of Hibernate 3, the APIs of which have completely changed under JPA 2 and Hibnerate 4.x. There are numerous problems with the implementation that make it wholly incompatible. – Darrell Teague Feb 23 '13 at 19:08

2 Answers2

21

For MySQL only, an alternative to implementing custom Hibernate types is to add the following JDBC options to your JDBC connection URL:

useTimezone=true
serverTimezone=UTC

This will force your JDBC connection into the UTC timezone and ask MySQL to perform conversions from the JVM timezone. The net effect is that you can keep a local timezone on your JVM (e.g. for printing out log messages and so forth), while DATETIME columns will be persisted as UTC.

For example:

<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>
            ...
Alex R
  • 11,364
  • 15
  • 100
  • 180
DanJ
  • 1,654
  • 1
  • 16
  • 23
3

get class public class UtcTimestampType extends TimestampType from your link
and make this code

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

using annotations

or

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

using *.hbm.xml

Community
  • 1
  • 1
Ilya
  • 29,135
  • 19
  • 110
  • 158
  • 2
    I don't want to annotate every date/timestamp property I have. I want hibernate to always use the UTCTimestampType instead of the default type. – samz Mar 22 '12 at 16:41
  • It is impossible. UTCTimestampType is custom user type. If you want, you can unpack Hibernate's library and hack it. – Ilya Mar 22 '12 at 16:55
  • Look under that example, at the hibernate 3.6 example. There's an example of a descriptor, not a type. Then it says that when the app starts you can register this type instead of the default one but it doesn't say how/where.. That's basically my question. – samz Mar 22 '12 at 16:59
  • You can do this, using class Configuration cfg = new Configuration().configure("your.cfg.xml"); cfg.registerTypeOverride(new UtcTimestampType()); – Ilya Mar 22 '12 at 18:17
  • I followed your trick using annotation but hibernate seems to ignore UtcTimestampType, Why? (even debugger breakpoints not hit) I have Hibernate 3.6.10 – fl4l Jun 04 '14 at 07:58