冬眠4和约达时间

他们幸福地结婚了吗?

我正在使用最新版本的hibernate(4)和joda-time hibernate支持版本1.3,我也认为这是最新版本。

在使用注释时,一切似乎都正常(按预期创builddate列):

@Column @Type(type="org.joda.time.contrib.hibernate.PersistentLocalDate") private LocalDate myDate; 

他们一起使用这些版本的任何已知的问题?

更新好的结果是列创build,但无法填充任何数据:

处理程序处理失败; 嵌套的exception是java.lang.AbstractMethodError:org.joda.time.contrib.hibernate.PersistentLocalDateTime.nullSafeSet

他们是不相容的,我应该使用usertype 。 见下面的答案。

明显缺乏文档,意味着我可能会写下集成所需的步骤。 确保你的库是最新的。

你需要:[假设你已经有了hibernate4]

约达时间的最新版本

 <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.0</version> </dependency> 

和usertype lib

 <dependency> <groupId>org.jadira.usertype</groupId> <artifactId>usertype.core</artifactId> <version>3.0.0.CR1</version> </dependency> 

然后在实体类中使用以下内容(不必是LocalDateTime,可以是任何可用的持久化类):

 import org.joda.time.LocalDateTime; 

和列定义:

 @Column(name="updated", nullable = false) @Type(type="org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime") private LocalDateTime updated; 

我将添加这个作为一个单独的答案,因为在我看来,任何人升级到Hibernate 4的重要信息,并需要迁移到使用jadira的持续时间types。 这个网页在hibernate 4和jodatime的谷歌search结果中排名很高,所以我会在这里添加它。 (有关此问题的单独讨论,请参阅: Joda时间DateTime错误地存储在数据库中 )

如果你在UTC以外的时区,需要一个重要的configuration,以获得与使用joda-time hibernate-supporttypes相同的行为。 jadira的临时types在缺省情况下工作的方式是将所有值转换为UTC时区,然后再保存到数据库,并在从数据库加载值时转换回系统的时区。

升级后我被烧毁了,当时我在数据库中有很多时间戳(UTC + 1(+2,夏令时))。 在升级到Hibernate 4之后加载时,1或2小时(取决于时间戳是否在夏令时间)被添加到数据库中的值,这意味着所有现有的时间戳被错误地呈现。 此外,新的时间戳值与UTC时区一起存储在数据库中,导致它们在应用程序中正确显示,但是在数据库中是错误的。 总而言之,时区和时间戳的混乱。

因此,为了得到与joda-time hibernate-support相同的行为(date时间被保持在所讨论服务器的时区中,数据库中的时间戳与正在加载到应用程序中的时间戳相同) ,以下属性必须添加到JPA / Hibernateconfiguration(在我的情况下, hibernate.properties ):

 jadira.usertype.autoRegisterUserTypes=true jadira.usertype.databaseZone=jvm jadira.usertype.javaZone=jvm 

这将确保数据库中的时间戳与应用程序的时区相同,而时区又是jvm的时区(大多数情况下是应用程序服务器的时钟)。

此外,据我所知, autoRegisterUserTypes属性删除了对@Type的注释的select通用types,其中Jodatimetypes的DateTimeLocalDate