(...) SYSDATE вставляется только один раз и не обновляется для последующих обновлений.
Прежде всего, позвольте мне кое-что прояснить: Generated
означает, что полегенерируется базой данных , и Hibernate должен прочитать ее после вставки / обновления, чтобы обновить сущность.Использование default SYSDATE
в определении столбца прекрасно работает для INSERT, но для UPDATE вам понадобится триггер.
Кроме того, lastUpdDTTM не является частью sql, сгенерированной hibernate.
Ну, вы сказали Hibernate, что поле ALWAYS
сгенерировано базой данных, поэтому я не удивлен, что Hibernate не включает его в сгенерированный SQL (на самом деле, я считаю, что это как-то конфликтует с udpatable = true
, Я ожидаю, что Hibernate будет жаловаться на это).
В любом случае, как я уже сказал, это не Hibernate, который будет обновлять это поле, это база данных, и вам нужен триггер, Hibernate просто обновит сущность послеобновите, чтобы получить новое значение.
Другой подход заключается в использовании аннотаций обратного вызова, например, для даты последнего обновления:
@PreUpdate
protected void updateDates() {
lastUpdDTTM = new Date();
}
Для лучшей согласованности вы можете дажеиспользуйте тот же подход для даты создания с @PrePersit
:
@PrePersist
@PreUpdate
protected void updateDates() {
Date now = new Date();
if (createdDTTM == null) {
createdDTTM = new Date(now.getTime());
}
lastUpdDTTM = now;
}