Установите время создания и обновления с помощью Hibernate в сопоставлениях XML

StackOverflow https://stackoverflow.com/questions/2635046

Вопрос

Я использую Hibernate с XML сопоставления. У меня есть сущность, у которой есть два поля Дата создания а также обновлять Тип timestamp, которые должны быть заполнены текущим временем UTC, когда сущность сохраняется и обновляется. Я знаю о существовании @PrePersist а также @PreUpdate Аннотации, но я не знаю, как использовать свой эквивалент в моих сопоставлениях XML.

Опять же, мне было интересно, если Hibernate каким-то образом поддерживает настроек времени обновления и создания.

Спасибо

Это было полезно?

Решение

Я знаю о существовании @PrePersist а также @PreUpdate Аннотации, но я не знаю, как использовать свой эквивалент в моих сопоставлениях XML.

Hibernate3. архитектура событий обеспечивает что-то эквивалентное, и вы могли бы зарегистрировать слушателей для PreInsertEvent, PreUpdateEvent или SaveOrUpdateEvent (см. org.hibernate.event Пакет для полного списка) Чтобы установить и обновить даты создания / обновления.

Другой подход будет использовать перехватчик, либо Sessionсплоченный или SessionFactoryсплочена и установить оба createDate а также updateDate в onSave(...), обновите updateDate в onFlushDirty(...).


Обновлять: Я покидаю свои первоначальные предложения ниже, но я думаю, что правильный подход (должен был быть моим первоначальным ответом) - использовать перехватчик или архитектуру событий.

Вы могли бы использовать generated атрибут timestamp получить creationDate а также updateDate Сгенерировано базой данных в «Вставка» и «Вставить» и «Обновить» соответственно:

<class name="MyEntity" table="MY_ENTITY">
  <id .../>
  <timestamp name="createDate" generated="insert" ... />
  <timestamp name="updateDate" generated="always" ... />
  ...
</class>

Обратитесь к разделу на Сгенерированные свойства Для получения полной информации.

Опция 1

Кажется, что timestamp не поддерживает generatead Итак, мое предложение не будет работать. Тем не менее, прочитав документацию более осторожно, мое понимание в том, что timestamp является альтернативой версией, и я не думаю, что это соответствующий выбор для таких областей, как createDate а также updateDate (Это может работать на позже, но это не то, что timestamp это для).

Так что я на самом деле все еще использовал Сгенерированные свойства но с участием Простые свойства вместо timestamp:

<class name="MyEntity" table="MY_ENTITY">
  <id .../>
  <property name="createDate" update="false" insert="false" generated="insert" ... />
  <property name="updateDate" update="false" insert="false" generated="always" ... />
  ...
</class>

На уровне базы данных это потребует с использованием триггера для updateDate столбец. Для createDate колонна, используя что-то вроде current_timestamp Поскольку значение по умолчанию будет работать хорошо. Но триггеры, возможно, не хотели ...

Вариант 2.

Чтобы избежать спускового крючка Опция 1, вариация будет использоваться updateDate для версий (и, таким образом, напечатать его как timestamp):

<class name="MyEntity" table="MY_ENTITY">
  <id .../>
  <timestamp name="updateDate" ... />
  <property name="createDate" update="false" insert="false" generated="insert" ... />
  ...
</class>

Тот же подход, что и вариант 1 для createDate, Используйте значение по умолчанию на уровне базы данных.

Вариант 3.

Посмотрите на вершину этого ответа ...

Другие советы

Timestamps в Hibernate, по-видимому, всегда обновляются автоматически при изменении объекта, поэтому вы не можете использовать <timestamp> сопоставление для даты создания. Тем не менее, вы можете хранить его как просто java.util.Date собственность, инициализировала его с new Date().

Для обновления Timestamp, попробуйте это:

public class MyEntity {
  ...
  private Date updateDate;
  ...
}

<class name="MyEntity" table="MY_ENTITY">
  <id .../>
  <timestamp name="updateDate" access="field" column="UPDATE_DATE"/>
  ...
</class>

Обратите внимание, что timestamp должен прийти сразу после id в картографии.

FYI вот ссылка timestamp атрибуты.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top