【问题标题】:Spring + Hibernate + JPA + multiple databasesSpring + Hibernate + JPA + 多个数据库
【发布时间】:2012-01-31 23:02:22
【问题描述】:

我有一个 Spring + Hibernate + JPA 应用程序。登录时,用户可以从要连接的数据库列表中进行选择(这些是要求)。所有 DB 都具有相同的架构,因此将使用相同的实体和 DAO。

现在我有一个 EntityManager(目前正在使用一个数据库),它像这样注入到 DAO 中:

@PersistenceContext
private EntityManager entityManager;

有没有办法让 DAO 根据从服务层收到的参数/属性自动接收 entityManager(由 Spring 管理)? (Web 层发送一种上下文,所选数据库的名称/代码/ID 将在其中)。

还是我必须自己管理(创建所有 entityManager,将它们放在地图中,告诉 DAO 每次调用使用哪一个)?

在问这个问题之前我做了一些研究,但结果没有定论 - 大多数问题涉及一个模型分布在 2 个或多个 DB 上以及跨越多个 DB 的事务,但我的情况并非如此。

在我的例子中,一旦用户连接,就好像他连接到一个只有一个实体管理器的应用程序,即他选择的数据库。 DB的中间会话或任何其他类似的东西之间没有切换。

谢谢。

【问题讨论】:

    标签: hibernate spring jpa entitymanager multiple-databases


    【解决方案1】:

    此功能称为多租户。

    Hibernate 4 应该开箱即用地支持它,但我不确定它是否可以与 Spring 管理的 EntityManager 集成。

    或者,最简单的方法是在ConnectionProvider 级别或DataSource 级别拦截数据库连接的创建,并根据存储在ThreadLocal 变量中的租户标识符选择适当的数据库。

    另请参阅:

    【讨论】:

      【解决方案2】:

      在春季,您可以使用以下方式使用注释配置 (AnnotationWebConfiguration) 动态构建 EntityManagerFactory:

      @Configuration
      public class MyAppConfig{
         public LocalContainerEntityManagerFactoryBean getEmf(){
             LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean ();
             Datasource ds = new .... ; // HERE!! you can create and configure your datasource to point to whatever you need
             emf.setName("system_pu");
             emf.setDatasource(ds);
             emf.setPackagesToScan(""); //optional if no persistence.xml is defined
             return emf;
         }
      }
      

      【讨论】:

        猜你喜欢
        • 2010-12-26
        • 1970-01-01
        • 2010-11-06
        • 1970-01-01
        • 1970-01-01
        • 2017-12-18
        • 1970-01-01
        • 1970-01-01
        • 2016-10-21
        相关资源
        最近更新 更多