不,您不需要 2 个单独的 POJO。但是,您确实需要 2 个单独的 Repository 接口定义,1 个用于 JPA,2 个用于 GemFire。我在repository-example 中有一个这样的实现示例here。
在contacts-core 模块中,我有一个example.app.model.Contact 类,除了其他注释(例如Jackson)之外,还使用JPA 的@Entity annotation 和SDG 的@Region annotation 进行了注释。
然后我在 repository-example 模块中创建 2 个存储库接口,1 for JPA,扩展 o.s.d.jpa.repository.JpaRepository,和 another for GemFire,扩展 o.s.d.gemfire.repository.GemfireRepository。另请注意,在我的示例中,这些存储库由包分隔(即 example.app.repo.jpa 与 example.app.repo.gemfire)。
请记住,Spring Data 强制使用 strict policy mode,如果应用程序存储库定义(例如 ContactRepository)是通用的,则可以防止歧义,这意味着接口扩展了常见的 1 个 Spring Data 接口:o.s.d.repository.Repository、o.s.d.repository.CrudRepository 或 o.s.d.repository.PagingAndSortingRepository,并且该接口与 JPA 和 GemFire 的“扫描”位于同一包中。这对于任何支持 Repository 抽象的 Spring Data 模块都是一样的,包括但不限于 MongoDB 和 Redis。
您的声明和意图必须非常明确。虽然通常不需要扩展特定于商店的存储库接口定义(例如 o.s.d.gemfire.repository.GemfireRepository),而是扩展通用接口(例如 o.s.d.repository.CrudRepository),但绝对建议您放置不同的每个商店存储库定义在单独的包中并相应地配置扫描。这是首先限制扫描的好习惯。
有些用户很想为他们将 POJO 持久保存到的所有商店的每个应用程序域模型类型(例如 Contact)都需要一个单一的“可重用”存储库接口定义。例如,单个 ContactRepository 用于 JPA 和 GemFire。这是不明智的。
这源于这样一个事实,尽管大多数商店都支持基本的 CRUD 和简单查询(例如 findById(..)),但不是全部(所以要小心),并非所有商店的查询能力(例如 JOINS)或功能(例如分页)。例如,SDG 目前还不支持 Paging。
所以重点是,使用 1 种域模型类型,但为每个商店定义一个存储库,并按包明确分隔。然后您可以相应地配置 Spring Data 存储库基础结构。例如,对于 JPA,我有一个 configuration,它使用 ContactRepository 类指向基于 JPA 的 ContactRepository(这是类型安全的,并且比使用 basePackages 属性按名称指定包更好)。然后,我对基于 GemFire 的 ContactRepository here 执行相同的操作。
按照这个秘籍,一切都很好,然后您可以将适当的存储库(按类型)注入到需要它的服务类中。如果您有一个需要两个存储库的服务类,那么您必须适当地注入它们,for example。
希望这会有所帮助!