【问题标题】:Can I use Spring Data JPA @Entity and Spring Data GemFire @Region together on the same POJO?我可以在同一个 POJO 上同时使用 Spring Data JPA @Entity 和 Spring Data GemFire @Region 吗?
【发布时间】:2018-03-27 07:11:56
【问题描述】:

当我尝试将相同的 POJO 用于 Spring Data JPA 与 Spring Data GemFire 的集成时,存储库始终使用 POJO 访问数据库。但我希望存储库能够访问来自 GemFire 的数据,即使我添加了注释 @EnableGemfireRepositories 和 @EnableEntityDefinedRegions。

我认为是因为我在同一个 POJO 类中添加了 @Entity 和 @Region。

请帮助修复并告诉我是否可以这样做?我是否需要将它分成 2 个用于数据库和 GemFire 的 POJO 类?

谢谢

【问题讨论】:

    标签: spring-data spring-data-gemfire


    【解决方案1】:

    不,您不需要 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。

    希望这会有所帮助!

    【讨论】:

    • 非常感谢您的回答和示例,John,现在当我使用 GemfireRepository 时,它会抛出异常,告诉“找不到类型 [my pojo Class] 的属性保存”
    • @John Blum,即使我面临与 Luis 相同的问题。您能否尝试运行您的应用程序,您可能会发现 Luis 提到的运行时异常
    • 对不起,我刚刚看到这个/这些评论。我有一段时间没有更新和运行这个 GH 存储库示例。我的意思是它更多地作为它可能的事实的参考。我在 SBDG 项目中也有一个 Multi-Store Smoke Test,您也可以参考 (github.com/spring-projects/spring-boot-data-geode/tree/master/…)。让我更新联系人应用程序并使用我的旧示例。之后我会跟进。感谢您的耐心等待。
    • 我想我找到了问题,我指的是你已经在解释中提到的 crud 存储库,我们应该使用“jpa 存储库” Luis 可能因为类似的事情而面临问题,谢谢你的例子有效!!
    • @John Blum 我看到在 CustomerFunctions 中也给出了 gemfire 函数,但是 CustomerFunctionExecutions 并不完全调用相同的方法,该方法已由 GemfireFunction public List findAll 注释,1) 你能解释一下什么执行界面中的命名约定是什么? 2) GemfireFunction 是否已注册/与 ClientCacheApplication 一起使用,如果只有 ClientCacheApplication 吗?
    猜你喜欢
    • 1970-01-01
    • 2020-09-26
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多