2015-12-10 3 views
6

Мы переносим код Hibernate (5.0.2) на Java 8, который также включает преобразование с java.util.Date в java.time.LocalDate (для решения вопросов, связанных с обработкой даты в Java 7). Одна из проблем, с которыми я столкнулся, - это то, как 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 использует по умолчанию григорианский календарь, и поскольку эта дата до того, как она была введена, используется некоторое преобразование.

Есть ли способ настроить Hibernate для отключения этого поведения (помимо реализации специального свойства)?

+0

Исправлена ​​ошибка (https://hibernate.atlassian.net/browse/HHH-10371) в Hibernate 5.0.6 (http://in.relation.to/2015/12/16/hibernate-orm- 506-окончательный выпуск /). –

+0

@engineer Это действительно исправлено, однако мы не можем его использовать, так как нет совместимой версии 'hibernate-validator', последняя версия которой в семействе 5.0.x была ** 5.0.3 **, и эта отказывается работать с 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.

Это не работает для OffsetDateTime либо:

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

    @Id 
    private Long id; 

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

и выполнить этот тест:

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); 
}); 

Броски:

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

Jira issue for this is here.

+0

Как только вы подали отчет об ошибке, не могли бы вы вернуться и оставить ссылку на него здесь? Благодаря! – yktoo

+1

Я добавил вопрос о Jira: https://hibernate.atlassian.net/browse/HHH-10371 –