2

我们正在尝试创建两个 Gemfire 存储库,因为它们正在处理两个不同的 bean 对象,但我们希望将这两个 bean 对象存储到同一个 gemfire 区域中。

这是正确的方法吗?如果“是”,那么该怎么做?

提前致谢。

4

1 回答 1

1

...我们想将这两个 bean 对象存储到同一个 gemfire 区域中。这是正确的方法吗?

这是值得商榷的。但是,这实际上取决于您的应用程序要求和用例。它还取决于对象之间的关系。

例如,如果您有一个Customerwhich extends (is-a) Person,那么将两者存储在同一个区域中可能看起来CustomersPeople没有那么糟糕。

但是,如果您要存储Customers并说Purchases,其中 aCustomer由 组成,或者“有” Set/List of Purchases,那么这更难消化。这也使得查询这个区域变得更加棘手,因为 (OQL) 查询引擎确实检查属性/字段的对象类型信息,甚至在查询内部调用方法调用,这可能导致ClassCastExceptionsand NoSuch[Method|Field]Exceptions。所以,要小心。

在这方面,我倾向于更纯粹,并建议/建议您将应用程序域模型对象保存在单独的区域中,尤其是在“有”关系的情况下。可以将数据存储在单独的区域中,并且仍然“并置”数据(即区域),特别是用于查询目的。有关更多详细信息,请参见此处

但...

这一切并不是说你不能实现在同一个 Region 中存储相似甚至不同类型的对象。

通常,您使用注释来注释您的业务、应用程序域对象,@Region以指定该对象将存储在哪个 GemFire 缓存区域中,就像这样......

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

@Region("Purchases")
class Purchase { ... }

然后你继续定义你的存储库......

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

interface PurchaseRepository extends GemfireRepository<Purchase, Long> { .. }

通常,当 SD Commons Repository 基础设施和 SD GemFire 的 Repository 扩展检测到 Repository 接口时,它会检查类型参数,查看应用程序域对象(即Customer& Purchase),检查这些并确定每个应用程序域对象所属的区域...

  1. 检测和检查@Region注释属性值,或者..

  2. 使用域对象类名的“简单”名称作为区域名称(即Customer域对象的“客户”区域)。

这决定了区域。

但是,如果您希望CustomerPurchase对象都存储在同一区域中,则 SD GemFire 扩展了公共存储库基础设施,并允许您使用注释对存储库接口进行@Region注释,如下所示...

@Region("Customers")
interface CustomerRepository extends GemfireRepository<Customer, Long> { .. }

@Region("Customers")
interface PurchaseRepository extends GemfireRepository<Purchase, Long> { .. }

在这种情况下,CustomerPurchase对象都将存储在“客户”区域中,因为@Region存储库接口上的注释会覆盖@Region单个应用程序域对象上的注释。

在 Spring Data GemFire 中专门允许此功能是有正当理由和用例的。要了解这方面的更多信息,请阅读此处

无论你采取什么方法,你都应该仔细权衡你的选择。

希望这可以帮助!

干杯,约翰

于 2016-07-29T17:14:00.580 回答