我们正在尝试创建两个 Gemfire 存储库,因为它们正在处理两个不同的 bean 对象,但我们希望将这两个 bean 对象存储到同一个 gemfire 区域中。
这是正确的方法吗?如果“是”,那么该怎么做?
提前致谢。
我们正在尝试创建两个 Gemfire 存储库,因为它们正在处理两个不同的 bean 对象,但我们希望将这两个 bean 对象存储到同一个 gemfire 区域中。
这是正确的方法吗?如果“是”,那么该怎么做?
提前致谢。
...我们想将这两个 bean 对象存储到同一个 gemfire 区域中。这是正确的方法吗?
这是值得商榷的。但是,这实际上取决于您的应用程序要求和用例。它还取决于对象之间的关系。
例如,如果您有一个Customer
which extends (is-a) Person
,那么将两者存储在同一个区域中可能看起来Customers
并People
没有那么糟糕。
但是,如果您要存储Customers
并说Purchases
,其中 aCustomer
由 组成,或者“有” Set/List of Purchases
,那么这更难消化。这也使得查询这个区域变得更加棘手,因为 (OQL) 查询引擎确实检查属性/字段的对象类型信息,甚至在查询内部调用方法调用,这可能导致ClassCastExceptions
and 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
),检查这些并确定每个应用程序域对象所属的区域...
检测和检查@Region
注释属性值,或者..
使用域对象类名的“简单”名称作为区域名称(即Customer
域对象的“客户”区域)。
这决定了区域。
但是,如果您希望Customer
和Purchase
对象都存储在同一区域中,则 SD GemFire 扩展了公共存储库基础设施,并允许您使用注释对存储库接口进行@Region
注释,如下所示...
@Region("Customers")
interface CustomerRepository extends GemfireRepository<Customer, Long> { .. }
@Region("Customers")
interface PurchaseRepository extends GemfireRepository<Purchase, Long> { .. }
在这种情况下,Customer
和Purchase
对象都将存储在“客户”区域中,因为@Region
存储库接口上的注释会覆盖@Region
单个应用程序域对象上的注释。
在 Spring Data GemFire 中专门允许此功能是有正当理由和用例的。要了解这方面的更多信息,请阅读此处。
无论你采取什么方法,你都应该仔细权衡你的选择。
希望这可以帮助!
干杯,约翰