Java 冬眠4和约达时间
他们结婚幸福吗 我使用的是hibernate(4)的最新版本和的1.3版,我相信这也是当前的最新版本 使用注释时,一切似乎正常(日期列按预期创建):Java 冬眠4和约达时间,java,hibernate,jodatime,Java,Hibernate,Jodatime,他们结婚幸福吗 我使用的是hibernate(4)的最新版本和的1.3版,我相信这也是当前的最新版本 使用注释时,一切似乎正常(日期列按预期创建): @Column @Type(type="org.joda.time.contrib.hibernate.PersistentLocalDate") private LocalDate myDate; 他们在一起使用这些版本时是否存在已知问题 更新 事实证明,这些列已创建,但无法填充任何数据: 处理程序处理失败;嵌套的异常是java.lang.A
@Column
@Type(type="org.joda.time.contrib.hibernate.PersistentLocalDate")
private LocalDate myDate;
他们在一起使用这些版本时是否存在已知问题
更新
事实证明,这些列已创建,但无法填充任何数据:
处理程序处理失败;嵌套的异常是java.lang.AbstractMethodError:org.joda.time.contrib.hibernate.PersistentLocalDateTime.nullSafeSet
它们是不兼容的,我应该使用。请参阅下面的答案。明显缺乏文档,这意味着我可以写下集成所需的步骤。确保您的库是最新的 您需要:[假设您已经有hibernate4] 最新版本的joda time
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.0</version>
</dependency>
对于列定义:
@Column(name="updated", nullable = false)
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime")
private LocalDateTime updated;
我将添加这个作为一个单独的答案,因为在我看来,这对于升级到Hibernate 4的任何人来说都是重要的信息,并且需要迁移到使用jadira的持久时间类型。这个页面在谷歌搜索Hibernate4和jodatime的结果中排名很高,所以我将把它添加到这里。(有关此问题的单独讨论,请参见:) 如果您所在的时区不是UTC,则需要进行重要的配置,以便获得与joda time hibernate支持类型相同的行为。默认情况下,jadira的时态类型的工作方式是在持久化到数据库之前将所有值转换为UTC时区,并在从数据库加载值时转换回系统时区 升级后,当我在数据库中有很多带有确切时区的时间戳时(UTC+1(+夏季时为2)),我就被这个问题烧坏了。在升级到Hibernate 4之后加载时,会将1或2小时(取决于时间戳是否在夏季)添加到数据库中的值,这意味着所有现有时间戳都错误地显示。此外,新的时间戳值以UTC时区存储在数据库中,导致它们在应用程序中正确显示,但在数据库中错误显示。总而言之,一堆乱七八糟的时区和时间戳 因此,为了获得与joda times hibernate支持相同的行为(持久化的datetime是相关服务器的时区,数据库中的时间戳与加载到应用程序中的时间戳相同),必须将以下属性添加到JPA/hibernate配置中(在我的例子中,
hibernate.properties
):
这将确保数据库中的时间戳与应用程序的时区相同,而应用程序的时区又是jvm的时区(在大多数情况下是应用程序服务器的时钟)
另外,据我所知,
autoRegisterUserTypes
-属性消除了对一系列常见类型的@Type
-注释的需要,其中包括Jodatime类型DateTime
和LocalDate您刚才告诉我们它们是一起工作的,不是吗?@skaffman我没有测试过任何其他类型n列创建…据我所知,以前的版本(joda time lib)必须针对更新版本的hibernate重新编译。这敲响了警钟-因此出现了一个问题…他们婚姻不幸福,hibernate有其他关系…和joda:/…她在导入LocalDate时也要小心,因为它现在在Java 8中也可用。我们如何知道它在我们选择的数据库中映射到什么类型?是的,所以使用自动生成表并查看输出?是的,这就是我要做的-翻阅hibernate文档是一个挑战,如果有人有同样的问题:我刚刚被UserType的新类型绊倒了,它注册了一大堆JodaTime类型,但没有LocalDateTime。指定上面暗示的类型仍然是你的问题Stefan,您应该发现LocalDateTime也在最新版本(3.0.0.GA)中注册。既然你已经解决了你的问题,而且它与这个问题没有直接关系,我将删除我的评论并将你的评论标记为删除,因此我们会保持评论部分的整洁和切中要害。只需要一个问题:为什么不将每个时间戳存储在UTC时间?如果服务器移动到不同的时区怎么办?我想最好存储所有的时间戳在UTC时间内设置时间戳,让客户端决定他在哪个时区。一般来说,我会同意。但在我的情况下,服务器不可能移动到其他时区。此外,这里的问题是默认行为会发生变化,在我的情况下,我不知道。因此,当你不知道这种情况发生时,你不能迁移删除您的数据,并最终得到一组具有不同时区的时间戳,这当然不好。但是,如果这对您的项目有意义,您可以跳过此处提供的设置,而是迁移数据库。使用所有UTC的一个负面影响是SQL报告要么很棘手,要么是错误的。考虑到这一点,我确实发现了错误将日期存储在服务器使用的时区以外的其他时区有什么根本性的错误。在SQLServer中,日期时间存储为自1900-01-01以来的天数,以及自午夜以来的时钟滴答数。在将日期转换为其他时区时,您还更改了日期的内部表示形式,这实际上会使日期不连续虽然我不知道这在实践中是否是一个问题,但我知道有些程序使用日期的内部表示来计算正确的时区偏移。
import org.joda.time.LocalDateTime;
@Column(name="updated", nullable = false)
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime")
private LocalDateTime updated;
jadira.usertype.autoRegisterUserTypes=true
jadira.usertype.databaseZone=jvm
jadira.usertype.javaZone=jvm