我正在探索子类化AbstractCouchbaseEventListener
以包括自定义文档/实体生命周期操作的选项。我对Spring很新,所以我意识到这可能是一种次优的方法(如果是,那么Spring的方式会更好或更常见?)。
目前,我正在考虑在保存/删除实体时设置/删除实体的参考文档。对于“参考文档”的当前目的,我的意思是将特定实体类唯一键值映射到包含它的文档的文档:如果User.username
是“billyTheKid”而User.id
是12345那么文档{ {1}}包含12345,因此用作指向用户文档的指针。
我目前的方法是拥有一个接口User:by:username: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()
实现来管理所有这些。我知道onBeforeSave()和onAfterSave()之间存在潜在的竞争条件,并且出于这种探索的目的,我对此感到满意。我遇到的问题是,一旦存储了这些参考文档,删除它们的“拥有”文档时就没有简单的方法来删除它们。 onBeforeDelete()/ onAfterDelete()方法只接收ReferenceDocumentOwnerSaveDeleteEventListener extends AbstractCouchbaseEventListener<ReferenceDocumentOwner>
,而不是源对象。
问题:为什么这些删除事件没有像其他事件处理程序一样传递给源对象?
问题:人们是否有推荐的方式/其他方式来实施参考文件?
另一个问题是CouchbaseDocument
和onBeforeDelete()
正在传递onAfterDelete()
而不是正在删除的文档,即使null
操作成功。
答案 0 :(得分:0)
回答我自己的问题(直到其他人可以更好地澄清):
进一步深入了解couchbase事件代码,看起来删除相关的事件对象将永远不会有CouchbaseDocument,因为它们是使用源对象创建的,但是使用CouchbaseMappingEvent
文档调用其超类null
构造函数论点。我发布了pull request that fixes this。