Как я могу сопоставить TIMESTAMP WITH TIME ZONE с типом данных Java, используя Hibernate 3.3.2GA?

Как сопоставить типы столбцов Oracle TIMESTAMP WITH TIME ZONE или TIMESTAMP WITH LOCAL TIME ZONE к данным Java ввести с помощью Hibernate 3.3.2GA? Могу ли я сопоставить каждый из них с Date или тип данных Calendar?


person Derek Mahar    schedule 02.11.2010    source источник


Ответы (1)


Используйте joda-time. Он имеет расширение для спящего режима.

@Columns(columns={@Column(name="startTime"),@Column(name="startTimezone")})
@Type(type="org.joda.time.contrib.hibernate.PersistentDateTimeTZ")
private DateTime startDateTime;

Но сначала убедитесь, что вам действительно нужно сохранить часовой пояс. Лучше хранить время в фиксированном TZ (скажем, UTC) и отображать его в соответствии с текущими предпочтениями пользователя. Людей интересует время события в их часовом поясе, а не в часовом поясе источника события.

person Bozho    schedule 02.11.2010
comment
Разве TIMESTAMP WITH LOCAL TIME ZONE не хранит в фиксированном часовом поясе (часовой пояс базы данных) и не переводит дату в часовой пояс клиента? - person Derek Mahar; 02.11.2010
comment
Я думаю, вам следует избегать LOCAL. Сделайте это в своем приложении, а не в конфигурации БД. - person Bozho; 02.11.2010
comment
Божо, я согласен с вашим комментарием при условии, что все приложения, обращающиеся к базе данных, следуют одному и тому же соглашению о фиксированном часовом поясе. В частности, все разработчики, которые могут получить доступ к базе данных напрямую, например, через специальный инструмент запросов, должны знать об этом соглашении, иначе они могут ошибочно интерпретировать время события в своем собственном часовом поясе, а не, скажем, в формате UTC. - person Derek Mahar; 03.11.2010
comment
Другая причина, по которой следует избегать фиксированного часового пояса, заключается в том, что вы не можете изменить часовой пояс JVM (через -Duser.timezone) и существует вероятность того, что JVM может переместиться на хост, расположенный в другом часовом поясе. Затем приложение будет смешивать даты из двух разных часовых поясов в базе данных. - person Derek Mahar; 03.11.2010
comment
Божо, согласно download.oracle.com/ docs/cd/B19306_01/server.102/b14225/ разработчики должны использовать тип данных TIMESTAMP WITH TIME ZONE, когда приложение используется в разных часовых поясах. Возможно, это хороший совет, когда разработчик не имеет права менять часовой пояс базы данных и JVM. - person Derek Mahar; 03.11.2010
comment
Если время идет от клиентов (рабочий стол, javascript), без сервера между клиентами и БД, то да, с использованием LOCAL все в порядке. В остальном будет ли настроено приложение или БД - это одно и то же. - person Bozho; 03.11.2010
comment
Оба типа служат разным целям. LOCAL хорош для хранения информации о времени, которую генерирует ваше приложение (временные метки в журналах). Автоматический пересчет часового пояса очень помогает при попытке показать его пользователям. TIMESTAMP WITH TIME ZONE, с другой стороны, отлично подходит, когда вы интегрируетесь с другими системами, и вам нужно передавать информацию точно так, как вы ее получаете, то есть включая исходный часовой пояс. Лучший подход IMO - сохранить время обработки для Oracle, а Java должна просто использовать его вслепую (без перерасчетов). Но этого как-то трудно добиться. :-/ - person sax; 02.01.2012
comment
Хотя можно использовать PersistentDateTimeTZ для хранения часового пояса в базе данных, следует отметить, что это решение не зависит от базы данных, поскольку для него требуется дополнительный столбец для часового пояса. Он НЕ использует метку времени Oracle с типом данных часового пояса (›8i). - person Marcel Stör; 07.02.2012
comment
Не всегда правильно говорить, что «людей интересует время в их часовом поясе». Время может быть разным, и говорить, что оно всегда должно быть преобразовано в местное время, не всегда правильно. - person Jeff Martin; 07.08.2012