Учитывая ваш список требований, у вас реально есть 3 варианта
- Использование триггера базы данных на вашей таблице для управления значениями отметки времени обновления.
- Использование обратного вызова
@PreUpdate
. - Делайте это как часть службы, когда у вас есть доступ к состоянию обновления и существующему состоянию.
Опция (1) довольно проста, поскольку у вас есть и текущее состояниеи обновлять состояние в триггере базы данных, и вы можете выполнять любые необходимые операции, чтобы определить, следует ли вам установить значение или принять существующее значение на момент обновления.
Единственным недостатком (1) и (2) является то, что (2) не будет зависеть от времени базы данных, а скорее от времени приложения, потому что вы будете делать это в приложениисервер.Но (2) имеет то преимущество, что ваш код для этого будет независимым от базы данных, что позволит вам развернуть его в любом месте на любой платформе базы данных, которая поддерживает Hibernate или имеет функционирующий диалект без каких-либо проблем.
Мое личное мнение, выберите (2), потому что он также довольно сфокусирован на доменном дизайне.
Для реализации (2) это довольно просто
@Entity
public class YourSuperDumperEntity {
// Clear this value on load
@PostLoad
public void postLoadClearFlags() {
fieldValuesChangedThatRequireTimestampUpdate = false;
}
// This handles the setting of the value at update-time
@PreUpdate
public void preUpdateCallbackAdjustTimestampOnChanges() {
if ( fieldValuesChangedThatRequireTimestampUpdate ) {
updateTimestamp = new Date();
}
}
public void setSomeFieldThatTriggersUpdateTimestamp(String value) {
// check if the old and new value differ enough to trigger update date
// if so, set the boolean flag here as follows
this.fieldValuesChangedThatRequireTimestampUpdate = true;
// now set the value
this.someFieldThatTriggersUpdateTimestamp = value;
}
}
Как я уже указывал ранее, вся прелесть здесь в том, что вся логика этого заключается в том, что он сам содержится в одном классе, которому он принадлежит, потому что то, о чем вы говорите, это состояние сущности.
Возможно, вам придется немного поиграть с обратными вызовами JPA, чтобы удовлетворить ваши потребности, но идея остается прежней.
Если вам не нравится (2), я бы предложил (3), потому что это поддерживает независимую от базы данных поддержку, которую я считаю гораздо более важной, чем отметка времени, полученная из самой базы данных.При правильной синхронизации времени операционной системы фактический источник времени не должен иметь значения.