Я использую, в спящем режиме с отображениями Xml. У меня есть объект, который имеет два поля creationDate и updateDate типа timestamp
, это должно быть заполнено текущим временем UTC, когда объект сохраняется и обновляется. Я знаю о существовании @PrePersist
и @PreUpdate
аннотации, но я не знаю, как использовать их эквивалент в моих отображениях Xml.
Снова, я задавался вопросом, в спящем режиме ли так или иначе поддержки исходно набор времени обновления и создания.
Спасибо
Я знаю о существовании
@PrePersist
и@PreUpdate
, но я не знаю, как использовать их эквивалент в своих сопоставлениях Xml.
Архитектура событий Hibernate3 предоставляет нечто эквивалентное, и вы можете зарегистрировать слушателей для PreInsertEvent
, PreUpdateEvent
или SaveOrUpdateEvent
(см. ] org.hibernate.event
для полного списка) для установки и обновления дат создания / обновления.
Другой подход заключается в использовании перехватчика либо с областью действия Session
, либо с областью действия SessionFactory
, а также для установки как createDate
, так и updateDate
в onSave (...)
, обновить updateDate
в onFlushDirty (...)
.
Обновление: Я оставляю свои первоначальные предложения ниже, но я думаю, что правильный подход (должен был быть моим первоначальным ответом) - использовать перехватчик или архитектуру событий.
Вы можете использовать атрибут сгенерированный
метки времени
, чтобы получить creationDate
и updateDate
, сгенерированные базой данных при вставке и при вставке. и обновить соответственно:
<class name="MyEntity" table="MY_ENTITY">
<id .../>
<timestamp name="createDate" generated="insert" ... />
<timestamp name="updateDate" generated="always" ... />
...
</class>
Подробную информацию см. в разделе о сгенерированных свойствах .
Похоже, что отметка времени
не поддерживает generatead
, поэтому мое предложение не сработает. Тем не менее, более внимательно прочитав документацию, я понял, что отметка времени
является альтернативой управлению версиями, и я не думаю, что это подходящий выбор для таких полей, как createDate
и updateDate
(может работать и в более поздних версиях, но не для этого отметка времени
).
Таким образом, я бы по-прежнему использовал сгенерированные свойства , но с простыми свойствами вместо отметки времени
:
<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
в качестве значения по умолчанию. Но триггеры, может быть, и не нужны ...
Чтобы избежать срабатывания Варианта 1 , можно было бы использовать updateDate
для управления версиями (и таким образом сопоставить его как отметку времени
]):
<class name="MyEntity" table="MY_ENTITY">
<id .../>
<timestamp name="updateDate" ... />
<property name="createDate" update="false" insert="false" generated="insert" ... />
...
</class>
Тот же подход, что и вариант 1 для createDate
, используйте значение по умолчанию на уровне базы данных.
См. Начало этого ответа ...
Метки времени в Hibernate, очевидно, всегда обновляются автоматически при изменении объекта, поэтому вы не можете использовать сопоставление
для Дата создания. Однако вы можете сохранить его как простое свойство java.util.Date
, инициализировав его с помощью new Date ()
.
Для отметки времени обновления попробуйте следующее:
public class MyEntity {
...
private Date updateDate;
...
}
<class name="MyEntity" table="MY_ENTITY">
<id .../>
<timestamp name="updateDate" access="field" column="UPDATE_DATE"/>
...
</class>
Обратите внимание, что отметка времени
должна стоять сразу после id
в отображении.
К вашему сведению, это ссылка на атрибуты отметки времени
.