休眠4和joda-time

Nim*_*sky 62 java hibernate jodatime

他们幸福地结婚了吗?

我正在使用最新版本的hibernate(4)和joda-time hibernate支持的 1.3版本,我也相信它是当前的最新版本.

使用注释时,一切似乎都正常工作(按预期创建日期列):

@Column
@Type(type="org.joda.time.contrib.hibernate.PersistentLocalDate")
private LocalDate myDate; 
Run Code Online (Sandbox Code Playgroud)

将这些版本一起使用是否存在任何已知问题?

更新 确定列已创建但无法填充任何数据:

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

它们是不兼容的,我应该使用usertype.见下面的答案.

Nim*_*sky 96

明显缺乏文档,这意味着我可能有助于记下集成所需的步骤.确保您的库是最新的.

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

joda-time的最新版本

<dependency>
    <groupId>joda-time</groupId>
    <artifactId>joda-time</artifactId>
    <version>2.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

和usertype lib

<dependency>
    <groupId>org.jadira.usertype</groupId>
    <artifactId>usertype.core</artifactId>
    <version>3.0.0.CR1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

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

import org.joda.time.LocalDateTime;
Run Code Online (Sandbox Code Playgroud)

和列定义:

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

  • 是的,我会做什么 - 挖掘hibernate文档是一个挑战 (2认同)
  • 万一有人有同样的问题:我刚刚跳过UserType的新[自动注册功能](http://blog.jadira.co.uk/blog/2012/1/19/release-jadira-usertype-300cr1-with -support-for-joda-money-0.html),它注册了一大堆JodaTime类型,但**不是**LocalDateTime.指定上面提到的类型仍然是您唯一的选择. (2认同)

Tob*_*obb 29

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

如果您所在的时区不是UTC,则需要一个重要的配置才能获得与joda-time hibernate-support类型相同的行为.jadira的临时类型默认工作的方式是在持久化到数据库之前将所有值转换为UTC时区,并在从数据库加载值时转换回系统的时区.

升级之后,当我在数据库中使用我的确切时区(UTC + 1(夏季时为+2))时,我有很多时间戳.在升级到Hibernate 4之后加载,1或2小时(取决于时间戳是否在夏令时期间)被添加到数据库中的值,这意味着所有现有时间戳都被错误地呈现.此外,新的时间戳值以UTC时区存储在数据库中,导致它们在应用程序中正确显示,但在数据库中出错.总而言之,时区和时间戳的热点.

因此,为了获得与joda-times hibernate-support相同的行为(持久化的日期时间是所讨论的服务器的时区,并且数据库中的时间戳与加载到应用程序中的时间戳相同) ,必须将以下属性添加到JPA/Hibernate配置(在我的例子中hibernate.properties):

jadira.usertype.autoRegisterUserTypes=true
jadira.usertype.databaseZone=jvm
jadira.usertype.javaZone=jvm
Run Code Online (Sandbox Code Playgroud)

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

此外,根据我的理解,autoRegisterUserTypes-property消除了@Type对选择的常见类型的注释的需要,其中包括Jodatime类型DateTimeLocalDate.

  • 既然你已经解决了你的问题,并且它与这个问题没有直接关系,我会删除我的评论并将你的评论标记为删除,所以我们保持评论部分的清洁和重点. (2认同)