我有一个持久化实体,其LocalTime
字段映射到postgre表中的time without time zone
列,我在我的应用程序中填充此字段,如下所示:
int hour = 10
int minutes = 12
MyEntity e = new MyEntity()
e.setTime(new LocalTime(hour, minutes) );
然后我使用hibernate将实体持久保存在db上,稍后在应用程序中我检索实体并显示时间字段,它正确显示10:12
但是当我在表上看到值时(使用pg-admin ),它显示:04:12
当它应该是10:12
时,我的jvm和我的sistem中的时区是CST(这是UTC-6)它在我看来,无论是休眠还是jodatime我的某个地方插入数据库和检索值时,时间字段开始转换为我的时区,我是否正确?有什么方法可以防止这种行为吗?我使用jre 1.6.0_22,hibernate 3,joda-time 1.5.1和joda-time-hibernate 1.2
修改 忘了提到该字段是用hibernate映射的:
type="org.joda.time.contrib.hibernate.PersistentLocalTimeAsTime"
答案 0 :(得分:2)
嗯,它可能已过时,但是名为PersistentLocalTime
的类的文档说明了这一点:
通过Hibernate将LocalTime持久化为SQL TIME数据类型 - 请注意,不会保留亚秒值。此类型基本上与org.joda.time.contrib.hibernate.PersistentLocalTimeAsTime兼容。 但是,请注意,org.joda.time.contrib.hibernate.PersistentLocalTimeAsTime包含一个错误,即由于使用了Time.setTime(long),写下来的时间将从GMT偏移。此类不受此问题的影响,但这意味着您不能依赖此类型的解释对两个类都相同。
(强调我的。)
听起来你遇到了这个问题,但使用PersistentLocalTime
代替它会修复它。