Я изучаю возможность создания подкласса 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()
выполнена успешно.