簡體   English   中英

休眠4和joda-time

[英]hibernate 4 and joda-time

他們幸福地結婚了嗎?

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

使用注釋時,一切似乎都正常工作(按預期創建日期列):

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

將這些版本一起使用是否存在任何已知問題?

更新確定列已創建但無法填充任何數據:

處理程序處理失敗; 嵌套異常是java.lang.AbstractMethodError:org.joda.time.contrib.hibernate.PersistentLocalDateTime.nullSafeSet

它們是不兼容的,我應該使用usertype 見下面的答案。

明顯缺乏文檔,這意味着我可能有助於記下集成所需的步驟。 確保您的庫是最新的。

你需要:[假設你已經有了hibernate4]

joda-time的最新版本

<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的持久時間類型的重要信息。 這個頁面在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

這將確保數據庫中的時間戳與應用程序的時區相同,而后者又是jvm的時區(在大多數情況下是應用程序服務器的時鍾)。

另外,根據我的理解, autoRegisterUserTypes -property消除了對選擇的常見類型的@Type -annotation的需要,其中包括Jodatime類型的DateTimeLocalDate

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM