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