#spring #mongodb #spring-boot #spring-data-jpa #spring-data
#весна #mongodb #весенняя загрузка #spring-data-jpa #spring-данные
Вопрос:
Я пытаюсь применить аудит для операции обновления и удаления, используя spring data MongoDB. Для операции добавления у меня есть приведенная ниже модель для поиска добавления в базе данных, которая работает отлично.
public class Audit {
@CreatedBy
private String CreatedBy;
@CreatedDate
private Instant createdDate;
@LastModifiedBy
private String lastModifiedUser;
@LastModifiedDate
private Instant lastModifiedDate;
}
Как мне сохранить историю операций обновления и удаления? Я знаю, что в spring data есть привязка жизненного цикла для MongoDB
@Component
@EnableMongoAuditing
public class GenericAuditing extends AbstractMongoEventListener<Object> {
private MongoTemplate mongoTemplate;
private static final Logger LOG = LoggerFactory.getLogger(GenericAuditing.class);
public GenericAuditing(MongoTemplate mongoTemplate) {
this.mongoTemplate = mongoTemplate;
}
@Override
public void onAfterSave(AfterSaveEvent<Object> event) {
LOG.info("On After Save inserting the record to the Delete and update collection");
}
@Override
public void onAfterDelete(AfterDeleteEvent<Object> event) {
LOG.info("On After delete inserting the record to the Delete and update collection");
Object obj = event.getSource();
DeleteUpdateAudit deleteUpdateAudit = new DeleteUpdateAudit(obj, DatabaseAction.DELETE);
this.mongoTemplate.insert(deleteUpdateAudit);
}
}
Как мне определить, что onAfterSave предназначен для сохранения или обновления. Поскольку этот метод вызывается как для сохранения, так и для обновления. Каков наилучший подход для аудита операций УДАЛЕНИЯ и ОБНОВЛЕНИЯ
Ответ №1:
Что касается идентификации сохранения или обновления, вы могли бы проверить Document
в AfterSaveEvent
. Если у него есть _id
, то это обновление:
@Override
public void onAfterSave(AfterSaveEvent<Object> event) {
LOG.info("On After Save inserting the record to the Delete and update collection");
boolean isUpdate = event.getDocument().containsKey("_id");
if (isUpdate) {
// add your specific update logic here
} else {
// add your specific insert logic
}
}
Ответ №2:
Вы можете получить из события время создания и дату последнего обновления. Если они равны, это сохранение
@Override
public void onAfterSave(AfterSaveEvent<User> event) {
Date creationTime = event.getDocument().getDate("creationTime");
Date lastUpdated = event.getDocument().getDate("lastUpdated");
if (creationTime.equals(lastUpdated)) {
// SAVE
} else {
// UPDATE
}
}