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

имам постоянен обект с поле LocalTime, съпоставено с time without time zone колона в таблица на postgre, попълвам това поле в моето приложение по следния начин:

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

след това запазвам обекта в db с помощта на хибернация, по-късно в приложението извличам обекта и показвам полето за време, то правилно показва 10:12, но когато видя стойността в таблицата (използвайки pg-admin), тя показва: 04:12 когато трябва да е 10:12, часовата зона в моя jvm и в моята система е CST (което е UTC-6) изглежда ми, че някъде в hibernate или jodatime моето часово поле започва да се преобразува в моята часова зона както при вмъкване в db, така и при извличане на стойностите, правилно ли съм? има ли някакъв начин за предотвратяване на това поведение?, използвам 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