SDG覆盖生成的查询

时间:2017-08-17 18:46:39

标签: spring-data spring-data-gemfire geode

Stack:Geode 9.1,SDG 2.0 场景:我们有一个场景,即动态创建(快照)临时区域,并希望利用SDG查询来使用这些新区域而不是定义的区域。 题; 是否有一个钩点来覆盖代理调用后的区域名称,因此我们可以为SDG存储库添加临时区域名称而不是定义的区域?

1 个答案:

答案 0 :(得分:1)

  

在代理调用之后是否有覆盖区域名称的钩点,因此我们可以为SDG存储库添加临时区域名称而不是已定义的区域?

嗯,是的,在SD的 Repository 基础设施的几个方面都有钩点(每个说法)你可以做到这一点,但它(特别是SDG)不是故意的设计时考虑到了这个目的,所以它有点牵扯。

如您所知,您使用 Spring 应用程序@Configuration类上的SDG @EnableGemfireRepositories注释启用了SDG 存储库,就像这样.. < / p>

@Configuration
@EnableGemfireRepositories(..)
class ApplicationGemFireConfiguration { .. }

实际上,&#34;代理&#34;由SD 存储库基础架构为特定于应用程序的SD 存储库接口扩展创建,由特定于数据存储(例如GemFire)SD模块提供的默认实现支持(例如SDG)。

确定此默认实现的一种方法是通过注释上的repositoryBaseClass属性。如您所见,它默认为o.s.d.g.repository.support.SimpleGemfireRepository

在内部,SD的存储库基础架构,特别是SDG,创建了一个SDG SimpleGemfireRepository类的实例来支持代理,以实现基本的CRUD和查询操作在SD CrudRepository接口上定义(因此开发人员不必这样做;开发人员只需要声明其他特定于应用程序的查询方法)。

SimpleGemfireRepositoryexpects o.s.d.g.GemfireTemplate的实例以及EntityInformation关于应用程序SD 持久保存(处理)的应用程序域对象类型的实例存储库。如您所知,这是由特定于应用程序的SD 存储库定义的,就像这样......

interface CustomerRepository extends GemfireRepository<Customer, Long> { .. }

应用程序域对象类型(即实体类;例如&#34; Customer&#34;)通常确定 Region ,其中持久化/访问该类型的对象(即mapped)......

@Region("Customers")
class Customer .. { .. }

正是这种映射元数据(即@Region("Customers"))默认为used by the SD[G] Repository infrastructure/extension,以确定实体所映射的GemFire Region 。如果我做出了解决方案,那会更容易一些。 Region 7可配置,例如可插入的策略界面,类似&#34; RegionResolver&#34; (我可以考虑一下)。

还可以覆盖应用程序 Repository 界面本身的 Region ;例如,除了上面的CustomersRepository之外,您还可以......

@Region("VIPS")
interface VipCustomerRepository extends CustomersRepository { .. }

再次,请参阅&#34; POJO mapping meta-data&#34;了解更多信息。

由于SimpleGemfireRepository委托GemfireTemplate执行所有 Region 数据访问操作,实际上GemfireTemplate引用了 Region 由repo使用。正如see所述,GemfireTemplate会引用 Region ,在其上执行数据访问操作,包括&#34;查询&#34;。同样, Region 7中的SD [G] Repo基础设施确定。

那么,你如何利用这些知识,我收集确定地区&#34;动态&#34;在运行时,因为你创建&#34;临时&#34; 地区就是这样。

嗯,您可以提供自己的实施班级(代替SDG&#39; SimpleGemfireRepository),就像这样......

@Configuration
@EnableGemfireRepositories(repositoryBaseClass = DynamicRegionGemfireRepository.class)
class ApplicationGemFireConfiguration { .. }

您仍然必须像以前一样定义一个接受GemfireTemplateEntityInformation的构造函数,in SDG's SimpleGemfireRepository类......

class DynamicRegionGemfireRepository<T, ID> extends SimpleGemFireRepository<T, ID {

    DynamicRegionGemfireRepository(GemfireTemplate gemfireTemplate, EntityInformation<T, ID> entityInformation) {

        super(new DyanmicRegionGemfireTemplate(gemfireTemplate, entityInformation), entityInformation);
    }
}

获得GemfireTemplate的引用后,您可以将其包装或替换为您自己的实现,例如......

class DynamicRegionGemfireTemplate<T, ID> extends GemfireTemplate {

  private final EntityInformation<T, ID> entityInformation;

  private final Region<?, T> primaryRegion;

  DynamicRegionGemfireTemplate(GemfireTemplate gemfireTemplate, EntityInformation entityInformation) {

    this.primaryRegion = gemfireTemplate.getRegion();
  }

  // override Region<?,?> getRegion() here

}

现在,您覆盖GemfireTemplate上的getRegion()方法(技术上,o.s.d.g.GemfireAccessorGemfireTemplate延伸。

@Override
public Region<K, V> getRegion() {

    // logically determine the "temporary" Region to use, 
    // perhaps using the EntityInformation, or else just return 
    // the primary Region if no temporary Region exists.

  return primaryRegion;
}

这样的事情......有意义吗?

还有其他方法可以实现这一目标。

无论如何,希望这有帮助!

此致 约翰