спящий режим 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 ответа:
явная нехватка документации, означает, что мне может быть полезно записать шаги, необходимые для интеграции. Убедитесь, что ваши библиотеки обновлены.
вам понадобится: [предполагая, что у вас уже есть 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-typesDateTime
иLocalDate
.