एक ऐसा उत्तर जोड़ना जो पूरी तरह से शॉन स्टोन से संकेत के साथ divestoclimb पर आधारित हो। बस इसे विस्तार से बताना चाहते थे क्योंकि यह एक आम समस्या है और समाधान थोड़ा भ्रामक है।
यह हाइबरनेट 4.1.4 का उपयोग कर रहा है। हालांकि, मुझे संदेह है कि 3.6 के बाद कुछ भी काम करेगा।
सबसे पहले, divestoclimb का UtcTimestampTypeDescriptor बनाएं
public class UtcTimestampTypeDescriptor extends TimestampTypeDescriptor {
public static final UtcTimestampTypeDescriptor INSTANCE = new UtcTimestampTypeDescriptor();
private static final TimeZone UTC = TimeZone.getTimeZone("UTC");
public <X> ValueBinder<X> getBinder(final JavaTypeDescriptor<X> javaTypeDescriptor) {
return new BasicBinder<X>( javaTypeDescriptor, this ) {
@Override
protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options) throws SQLException {
st.setTimestamp( index, javaTypeDescriptor.unwrap( value, Timestamp.class, options ), Calendar.getInstance(UTC) );
}
};
}
public <X> ValueExtractor<X> getExtractor(final JavaTypeDescriptor<X> javaTypeDescriptor) {
return new BasicExtractor<X>( javaTypeDescriptor, this ) {
@Override
protected X doExtract(ResultSet rs, String name, WrapperOptions options) throws SQLException {
return javaTypeDescriptor.wrap( rs.getTimestamp( name, Calendar.getInstance(UTC) ), options );
}
};
}
}
फिर UtcTimestampType बनाएँ, जो सुपर कंस्ट्रक्टर कॉल में SqlTypeDescriptor के रूप में TimestampTypeDescriptor के बजाय UtcTimestampTypeDescriptor का उपयोग करता है, लेकिन अन्यथा टाइमस्टैम्पटाइप के लिए सब कुछ प्रतिनिधि:
public class UtcTimestampType
extends AbstractSingleColumnStandardBasicType<Date>
implements VersionType<Date>, LiteralType<Date> {
public static final UtcTimestampType INSTANCE = new UtcTimestampType();
public UtcTimestampType() {
super( UtcTimestampTypeDescriptor.INSTANCE, JdbcTimestampTypeDescriptor.INSTANCE );
}
public String getName() {
return TimestampType.INSTANCE.getName();
}
@Override
public String[] getRegistrationKeys() {
return TimestampType.INSTANCE.getRegistrationKeys();
}
public Date next(Date current, SessionImplementor session) {
return TimestampType.INSTANCE.next(current, session);
}
public Date seed(SessionImplementor session) {
return TimestampType.INSTANCE.seed(session);
}
public Comparator<Date> getComparator() {
return TimestampType.INSTANCE.getComparator();
}
public String objectToSQLString(Date value, Dialect dialect) throws Exception {
return TimestampType.INSTANCE.objectToSQLString(value, dialect);
}
public Date fromStringValue(String xml) throws HibernateException {
return TimestampType.INSTANCE.fromStringValue(xml);
}
}
अंत में, जब आप अपने हाइबरनेट कॉन्फ़िगरेशन को इनिशियलाइज़ करते हैं, तो UtcTimestampType को एक प्रकार के ओवरराइड के रूप में पंजीकृत करें:
configuration.registerTypeOverride(new UtcTimestampType());
अब टाइमस्टैम्प को JVM के समय क्षेत्र के साथ और उसके डेटाबेस से संबंधित नहीं होना चाहिए। HTH।