Spring+Hibernate+JPA+多个数据库



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

现在,我有一个EntityManager(目前正在处理一个数据库),它被注入到DAO中,如下所示:

@PersistenceContext
private EntityManager entityManager;

有没有任何方法可以让DAO根据从服务层接收的参数/属性自动接收entityManager(由Spring管理)?(web层发送一种上下文,所选数据库的名称/code/id将在其中)。

或者我必须自己管理它(创建所有entityManager,将它们放在一个映射中,告诉DAO每个调用要使用其中的哪一个)?

在提出这个问题之前,我做了一些研究,但结果没有定论——大多数问题都涉及一个分布在2个或多个数据库上的模型和跨多个数据库的事务,但我的情况并非如此

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

谢谢。

此功能称为多租户。

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

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

另请参阅:

  • 多租户设计
  • Hibernate中的多租户

在spring中,您可以使用Annotation配置(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;
   }
}

相关内容

  • 没有找到相关文章

最新更新