Subclassing AbstractCouchbaseEventListener事件问题

时间:2014-08-13 18:14:14

标签: java couchbase spring-data-couchbase

我正在探索子类化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 (); } 这里只是另一个定义BasicDocumentgetId()的简单界面。)

我有一个setId()实现来管理所有这些。我知道onBeforeSave()和onAfterSave()之间存在潜在的竞争条件,并且出于这种探索的目的,我对此感到满意。我遇到的问题是,一旦存储了这些参考文档,删除它们的“拥有”文档时就没有简单的方法来删除它们。 onBeforeDelete()/ onAfterDelete()方法只接收ReferenceDocumentOwnerSaveDeleteEventListener extends AbstractCouchbaseEventListener<ReferenceDocumentOwner>,而不是源对象。

问题:为什么这些删除事件没有像其他事件处理程序一样传递给源对象?

问题:人们是否有推荐的方式/其他方式来实施参考文件?

编辑:

另一个问题是CouchbaseDocumentonBeforeDelete()正在传递onAfterDelete()而不是正在删除的文档,即使null操作成功。

1 个答案:

答案 0 :(得分:0)

回答我自己的问题(直到其他人可以更好地澄清):

进一步深入了解couchbase事件代码,看起来删除相关的事件对象将永远不会有CouchbaseDocument,因为它们是使用源对象创建的,但是使用CouchbaseMappingEvent文档调用其超类null构造函数论点。我发布了pull request that fixes this