поддержка jodatime и hibernate меняет часовой пояс

у меня есть постоянный объект с полем LocalTime, сопоставленным со столбцом time without time zone в таблице postgre, я заполняю это поле в своем приложении следующим образом:

int hour = 10
int minutes = 12
MyEntity e = new MyEntity()
e.setTime(new LocalTime(hour, minutes) );

затем я сохраняю объект в базе данных с помощью спящего режима, позже в приложении я извлекаю объект и отображаю поле времени, он правильно показывает 10:12, но когда я вижу значение в таблице (используя pg-admin), он показывает: 04:12 когда это должно быть 10:12, часовой пояс в моем jvm и в моей системе - CST (то есть UTC-6), мне кажется, что где-то в спящем режиме или jodatime мое поле времени начинает преобразовываться в мой часовой пояс как при вставке в БД, так и при получении значений, я прав? Есть ли способ предотвратить это поведение? Я использую jre 1.6.0_22, hibernate 3, joda-time 1.5.1 и joda-time-hibernate 1.2.

редактировать: забыл упомянуть, что поле отображается в спящем режиме с помощью:

type="org.joda.time.contrib.hibernate.PersistentLocalTimeAsTime"

person Harima555    schedule 11.12.2010    source источник


Ответы (1)


Ну, это может быть устаревшим, но документы для класса с именем PersistentLocalTime говорят следующее:

Сохраняйте LocalTime через Hibernate как тип данных SQL TIME — обратите внимание, что значения доли секунды не будут сохранены. Этот тип в основном совместим с org.joda.time.contrib.hibernate.PersistentLocalTimeAsTime. Однако обратите внимание, что org.joda.time.contrib.hibernate.PersistentLocalTimeAsTime содержит ошибку, из-за которой записанное время будет смещено относительно GMT из-за использования Time.setTime(long). Этот класс не затрагивается этой проблемой, но это означает, что вы не можете полагаться на то, что интерпретация этого типа будет одинаковой для обоих классов.

(Выделение мое.)

Похоже, вы столкнулись с этой проблемой, но использование PersistentLocalTime вместо этого решит ее.

person Jon Skeet    schedule 11.12.2010
comment
да, Джон Скит спешит на помощь =), просто упомянем, что этот класс в проекте usertype для спящего режима: usertype.sourceforge. net, использование org.jadira.usertype.dateandtime.joda.PersistentLocalTime в качестве типа в файле сопоставления эффективно решает эту проблему. - person Harima555; 12.12.2010