1

我知道关于我的主题已经有很多问题,但我对任何答案都没有真正完全满意。在网上也很难找到像样的信息,所以我开始提出一个新问题。

基本上,我正在努力解决如何在 Spring 应用程序中最好地使用 JPA 来满足必须符合以下要求的场景:

  • 使用 Spring 事务管理
  • 使用多个持久性单元(支持 Spring Data Repository)
  • 使用多个数据源(我希望能够在运行时动态切换 PersistenceUnit 的数据源)
  • 将应用程序的各个部分(包括 JPA 实体)组合到单独的模块中,以便在不同的项目中使用它们

考虑以下用例

  • 应用程序 A 允许用户从不同的 DataSource、D1、D2、Dn 读取和写入 DB 数据。我只需要一个 PersistenceUnit P1 来定义所需的实体
  • 模块 M 包含两个实体 AuthUser 和 AuthRole,用于存储用户和权限信息。我想在不同的项目中模块化使用它。基本上,我需要能够定义仅包含两个实体和一个 DataSource Da 的 PersistenceUnit P2,因为用户存储在一个数据库中,独立于应用程序访问的其他 DataSources D1、D2、...。
  • 应用程序 A 包括模块 M 并定义它应该使用哪个数据源

我遇到的问题:

  • 我想在模块 M 中使用 @PersistenceContext 和 @Transactional,而不必到处指定显式的 persistenceUnits 或 transactionManagers。理想情况下,Spring 将使用正在运行的事务的 PersistenceContext / EntityManager。这样,我将在应用程序 A 的事务方法中指定所需的 PersistenceUnit,模块 M 将继承事务和 PersistenceContext。我找不到如何做到这一点的解决方案。我正在考虑提供一个自定义的 PersistenceAnnotationBeanPostProcessor,但我在网上找不到关于这个主题的任何资源。
  • 为了使用具有相同 PersistenceUnit 的多个 DataSource,我查看了 AbstractRoutingDatatSource。这应该可以工作,即使我对它如何与 Transactional 注释合作持怀疑态度。关于使用它以及如何防止在事务中间更改数据源的任何经验?

我希望我能把我的观点说清楚。我不想在第一个实例中包含太多代码,我对概念答案比技术答案更感兴趣。将其归结为一个(大)句子:

Spring / JPA 中使用多个 PersistenceUnits 和 DataSources 构建模块化事务应用程序的最佳实践是什么,而无需在源代码(尤其是模块)中指定硬编码的持久性信息(如 persistenceUnit 名称)?

4

0 回答 0