AbstractMongoEventListener для идентификации обновления или добавления события весенней загрузки MongoDB

#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
        }
    }