Подкласс проблем события AbstractCouchbaseEventListener

Я изучаю возможность создания подкласса AbstractCouchbaseEventListener для включения настраиваемых действий жизненного цикла документа/сущности. Я новичок в Spring, поэтому я понимаю, что это может быть неоптимальный способ сделать это (если это так, что было бы лучше или более распространенным способом Spring?).

В настоящее время я рассматриваю настройку/удаление справочных документов для сущностей по мере их сохранения/удаления. Для текущих целей под «справочным документом» я подразумеваю документ, который сопоставляет значение уникального ключа определенного класса сущностей с документом, который его содержит: если User.username — это «billyTheKid», а User.id — это 12345, то документ User:by:username:12345 содержит 12345 и поэтому служит указателем. к пользовательскому документу.

Мой текущий подход состоит в том, чтобы иметь интерфейс ReferenceDocumentOwner, который может быть реализован любым классом сущностей, который хочет хранить справочные документы:

public interface ReferenceDocumentOwner<T, R> extends BasicDocument {

    /*
    Store the existing (stored) version of the entity.  This is called in onBeforeSave()
    to populate the about-to-be saved instance with its stored version.  This previous
    version can be used to determine the fields and values to populate the returns of
    getDeleteRefDocMap() and getStoreRefDocMap().
    */
    public void storePreviousRecord(T recorded);

    public Class<R> getRepositoryClass();

    /*
    For values that used to be non-empty but are now empty.  For example, if the 
    concrete implementation of this interface was User.class and this method returned:

        electricServiceId => 12345,
        garbageServiceId => AKIE3423

    The reference documents {@code User:by:electricServiceId:12345} and 
    {@code User:by:garbageServiceId:AKIE3423} would be deleted in onAfterSave().
     */
    public Map<String, Object> getDeleteRefDocMap ();

    /*
    For values that are non-empty. For example, if the concrete implementation of this
    interface was User.class and this method returned:

        email => someEmailValue,
        garbageServiceId => AKIE3423,
        username => billyTheKid

    The reference documents {@code User:by:email:someEmailValue},
    {@code User:by:garbageServiceId:AKIE3423}, and {@code User:by:username:billyTheKid}
    would be stored pointing to the User instance's {@code id} in onAfterSave().
     */
    public Map<String, Object> getStoreRefDocMap ();
}

(BasicDocument здесь просто еще один простой интерфейс, определяющий getId() и setId().)

И у меня есть реализация ReferenceDocumentOwnerSaveDeleteEventListener extends AbstractCouchbaseEventListener<ReferenceDocumentOwner>, которая управляет всем этим. Я знаю, что между onBeforeSave() и onAfterSave() возможны условия гонки, и для целей данного исследования я согласен с этим. Проблема, с которой я сталкиваюсь, заключается в том, что после сохранения этих справочных документов нет простого способа удалить их, когда их «владеющий» документ удаляется. Методы onBeforeDelete()/onAfterDelete() получают только CouchbaseDocument, а не исходный объект.

Вопрос: почему эти события удаления не передаются исходному объекту, как это делают другие обработчики событий?

Вопрос: есть ли рекомендуемый способ/другой способ реализации справочных документов?

Редактировать:

Еще одна проблема заключается в том, что onBeforeDelete() и onAfterDelete() передаются null вместо удаления документа, хотя операция repository.delete() выполнена успешно.


person atani    schedule 13.08.2014    source источник


Ответы (1)


Отвечая на мой собственный вопрос (пока кто-то другой не сможет лучше уточнить):

Если углубиться в код события диванной базы, то окажется, что объекты событий, связанные с удалением, никогда не будут иметь CouchbaseDocument, поскольку они создаются с помощью исходного объекта, но вызывают конструктор своего суперкласса CouchbaseMappingEvent с аргументом документа null. Я отправил запрос на включение, который исправляет это.

person atani    schedule 15.08.2014