使用Spring JPA的多个PersistenceUnits和DataSource

时间:2013-02-06 09:59:31

标签: java spring jpa spring-data-jpa

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

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

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

考虑以下UseCase

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

我遇到的问题:

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

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

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

0 个答案:

没有答案