спящий режим 4 и Джода-время


они счастливы в браке ?

Я использую последнюю версию hibernate (4) и версию 1.3 поддержка гибернации joda-time, который я также считаю последним выпуском.

Кажется, что все работает нормально (столбцы дат, созданные как ожидалось) при использовании аннотаций:

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

есть ли у них какие-либо известные проблемы с использованием этих версий вместе ?

обновление Ну получается колонны создаются, но не в состоянии заполнить все данные :

обработка обработчик не удалось; вложенные исключением является Java.ленг.AbstractMethodError: org.Джода.время.ВНО.зимовать.PersistentLocalDateTime.nullSafeSet

они несовместимы, и я должен использовать usertype. см. ответ ниже.

2 62

2 ответа:

явная нехватка документации, означает, что мне может быть полезно записать шаги, необходимые для интеграции. Убедитесь, что ваши библиотеки обновлены.

вам понадобится: [предполагая, что у вас уже есть 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. Эта страница высоко оценена в результатах поиска google для hibernate 4 и jodatime, поэтому я добавлю ее здесь. (Для отдельного обсуждения этого вопроса, см.: Joda time DateTime неправильно хранит в базе данных)

если вы находитесь в часовом поясе, отличном от UTC, важная часть конфигурация необходима для того, чтобы получить такое же поведение, как и с типом поддержки гибернации joda-time. Способ работы временных типов jadira по умолчанию заключается в преобразовании всех значений в часовой пояс UTC перед сохранением в базе данных и преобразовании обратно в часовой пояс системы при загрузке значений из базы данных.

я обжегся этим после обновления, когда у меня было много временных меток с моим точным часовым поясом в базе данных (UTC+1 (+2, Когда лето)). Когда загруженный после обновления до спящего режима 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 (in в большинстве случаев часы сервера приложений).

кроме того, из того, что я понимаю,autoRegisterUserTypes - свойство устраняет необходимость в @Type-аннотация для выбора общих типов, среди них Jodatime-types DateTime и LocalDate.