Shaun Stone의 힌트를 사용하여 완전히 기반하고 매각에 빚진 답변을 추가합니다 . 일반적인 문제이고 해결책이 약간 헷갈 리기 때문에 자세히 설명하고 싶었습니다.
이것은 Hibernate 4.1.4.Final을 사용하고 있지만 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 );
}
};
}
}
그런 다음 상위 생성자 호출에서 SqlTypeDescriptor로 TimestampTypeDescriptor 대신 UtcTimestampTypeDescriptor를 사용하지만 그렇지 않으면 모든 것을 TimestampType에 위임하는 UtcTimestampType을 만듭니다.
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);
}
}
마지막으로 Hibernate 구성을 초기화 할 때 UtcTimestampType을 유형 재정의로 등록합니다.
configuration.registerTypeOverride(new UtcTimestampType());
이제 타임 스탬프는 데이터베이스를 오가는 JVM의 시간대와 관련이 없어야합니다. HTH.