Установите время создания и обновления с помощью Hibernate в сопоставлениях XML
-
26-09-2019 - |
Вопрос
Я использую 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
атрибуты.