Hibernate force timestamp to persist/load as UTC
Solution 1
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&serverTimezone=UTC</prop>
...
Solution 2
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
Related videos on Youtube
samz
Updated on April 29, 2020Comments
-
samz almost 4 years
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?
-
ManuPK about 12 yearsWhy don't you try implementing community.jboss.org/wiki/UserTypeForNon-defaultTimeZone and then come up with the specific questions.
-
-
samz about 12 yearsI don't want to annotate every date/timestamp property I have. I want hibernate to always use the UTCTimestampType instead of the default type.
-
Ilya about 12 yearsIt is impossible. UTCTimestampType is custom user type. If you want, you can unpack Hibernate's library and hack it.
-
samz about 12 yearsLook 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.
-
Ilya about 12 yearsYou can do this, using class Configuration cfg = new Configuration().configure("your.cfg.xml"); cfg.registerTypeOverride(new UtcTimestampType());
-
fl4l almost 10 yearsI followed your trick using annotation but hibernate seems to ignore UtcTimestampType, Why? (even debugger breakpoints not hit) I have Hibernate 3.6.10