2015-12-10 9 views
6

Hibernate(5.0.2)コードをJava 8に移行します。java.util.Dateからjava.time.LocalDateへの変換も含まれます(Java 7の日付処理に関する問題を解決するため)。私が実行した問題の1つは、Hibernateが "ゼロデート"として使用している特別な値をどのように扱うかです。これは0001-01-01です。Hibernate 5がLocalDateを正しく処理しない

@NotNull 
@Column(name = "START_DATE", nullable = false) 
private LocalDate startDate; 

値は0001-01-01としてデータベースに格納され、それはHibernateがロードされ、それが突然0000-12-29になっていますがとき、次のように

プロパティが宣言されています。これは、HibernateがデフォルトでGregorianカレンダーを使用し、この日付が導入される前からある程度の変換が使用されているために起こります。

Hibernateは、この動作を無効にする設定(別に特別なプロパティライターの実装から)する方法はありますか?

+0

バグが(https://hibernate.atlassian.net/browse/HHH-10371)休止5.0.6(http://in.relation.to/2015/12/16/hibernate-orm-に固定しました506-final-release /)を参照してください。 –

+0

@engineer実際には修正されていますが、バージョン5.0.xファミリの最新バージョンが5.0.3 **である 'hibernate-validator'の互換バージョンは存在しないので、使用することはできません。 5.0.6 'hibernate-core'での動作を拒否しました。なぜバージョンがこれほど遅れているのか/それが修正されるのか、 – yktoo

答えて

3

実際にはバグです。私はthe following testにそれを複製しました。私はバグレポートを開きます。

私がLocalDate使用する場合:

@Entity(name = "LocalDateEvent") 
public class LocalDateEvent { 

    @Id 
    private Long id; 

    @NotNull 
    @Column(name = "START_DATE", nullable = false) 
    private LocalDate startDate; 
} 

と、このテストを実行します。

doInJPA(entityManager -> { 
    LocalDateEvent event = new LocalDateEvent(); 
    event.id = 1L; 
    event.startDate = LocalDate.of(1, 1, 1); 
    entityManager.persist(event); 
}); 

doInJPA(entityManager -> { 
    LocalDateEvent event = entityManager.find(LocalDateEvent.class, 1L); 
    assertEquals(LocalDate.of(1, 1, 1), event.startDate); 
}); 

を私が手:

java.lang.AssertionError: expected:<0001-01-01> but was:<0000-12-29> 

Jira issue is here

@Entity(name = "OffsetDateTimeEvent") 
public static class OffsetDateTimeEvent { 

    @Id 
    private Long id; 

    @NotNull 
    @Column(name = "START_DATE", nullable = false) 
    private OffsetDateTime startDate; 
} 

と、このテストを実行している:

それはOffsetDateTimeのいずれかのために動作しません

doInJPA(entityManager -> { 
    OffsetDateTimeEvent event = new OffsetDateTimeEvent(); 
    event.id = 1L; 
    event.startDate = OffsetDateTime.of(1, 1, 1, 0, 0, 0, 0, ZoneOffset.UTC); 
    entityManager.persist(event); 
}); 

doInJPA(entityManager -> { 
    OffsetDateTimeEvent event = entityManager.find(OffsetDateTimeEvent.class, 1L); 
    assertEquals(OffsetDateTime.of(1, 1, 1, 0, 0, 0, 0, ZoneOffset.UTC), event.startDate); 
}); 

例外:Jira issue for this is here

java.lang.AssertionError: expected:<0001-01-01T00:00Z> but was:<0001-01-01T01:34:52+01:34:52> 

を。

+0

バグレポートを提出したら、ここに戻ってリンクを残すことができますか?ありがとう! – yktoo

+1

Jiraの問題を追加しました:https://hibernate.atlassian.net/browse/HHH-10371 –

関連する問題