Когда Hibernate записывает объект календаря Java в столбец SQL TIMESTAMP, для какого часового пояса он корректирует дату, дату компьютера или дату, указанную в объекте календаря (или какой-либо другой)?
Hiberante 3.x использует следующее в CalendarType
(см. HB-1006 ):
public void set(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
final Calendar cal = (Calendar) value;
//st.setTimestamp( index, new Timestamp( cal.getTimeInMillis() ), cal ); //JDK 1.5 only
st.setTimestamp( index, new Timestamp( cal.getTime().getTime() ), cal );
}
Таким образом, Hibernate использует PreparedStatement#setTimestamp(int, Timestamp, Calendar)
который использует часовой пояс календаря.
Когда Hibernate считывает TIMESTAMP в объект календаря, в какой часовой пояс он переводит дату?
Хорошо,еще раз, давайте посмотрим на класс CalendarType
:
public Object get(ResultSet rs, String name) throws HibernateException, SQLException {
Timestamp ts = rs.getTimestamp(name);
if (ts!=null) {
Calendar cal = new GregorianCalendar();
if ( Environment.jvmHasTimestampBug() ) {
cal.setTime( new Date( ts.getTime() + ts.getNanos() / 1000000 ) );
}
else {
cal.setTime(ts);
}
return cal;
}
else {
return null;
}
}
Итак, Hibernate создает значение по умолчанию GregorianCalendar
, используя текущее время в часовой пояс по умолчанию с языком по умолчанию.
В качестве примечания настоятельно рекомендую прочитать следующий вопрос: