শোন স্টোন থেকে একটি ইঙ্গিত দিয়ে ডাইভস্টক্লিম্বে সম্পূর্ণরূপে নির্ভর ও iveণী একটি উত্তর যুক্ত করা । এটি কেবল একটি সাধারণ সমস্যা এবং সমাধানটি কিছুটা বিভ্রান্তিকর হওয়ার কারণে এটি বিশদে বিশদটি ব্যাখ্যা করতে চেয়েছিল।
এটি হাইবারনেট ৪.১.৪ ব্যবহার করছে F ফাইনাল, যদিও আমি সন্দেহ করি যে ৩. after এর পরে কিছু কাজ করবে।
প্রথমে ডাইভস্টোক্লেম এর ইউটিটাইমস্ট্যাম্পটাইপডিজিপেক্টর তৈরি করুন
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 );
}
};
}
}
তারপরে উত্সটাইমস্ট্যাম্পটাইপ তৈরি করুন, যা সুপার কনস্ট্রাক্টর কলটিতে স্কেলটাইপডেস্ক্রিপ্টরের পরিবর্তে টাইমস্ট্যাম্পটাইপডেস্ক্রিপ্টরের পরিবর্তে উত্সটাইমস্ট্যাম্পটাইপডেস্কিপ্টার ব্যবহার করে তবে অন্যথায় সমস্ত কিছু টাইমস্ট্যাম্পটাইপকে অর্পণ করে:
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);
}
}
অবশেষে, আপনি যখন হাইবারনেট কনফিগারেশনটি আরম্ভ করবেন, তখন টাইপ ওভাররাইড হিসাবে উত্সটাইমস্ট্যাম্পটাইপটি নিবন্ধ করুন:
configuration.registerTypeOverride(new UtcTimestampType());
এখন টাইমস্ট্যাম্পগুলি JVM এর সময় অঞ্চলের সাথে ডেটাবেসগুলিতে এবং তাদের পথে যাওয়া উচিত নয়। আছে HTH।