Spring + Hibernate + JPA +多个数据库

时间:2012-01-02 16:45:27

标签: hibernate spring jpa entitymanager multiple-databases

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

现在我有一个EntityManager(目前正在使用一个数据库),它注入DAO,如下所示:

@PersistenceContext
private EntityManager entityManager;

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

或者我是否必须自己管理(创建所有的entityManagers,将它们放在地图中,告诉DAO每个呼叫使用哪一个)?

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

在我的情况下,一旦用户连接,就好像他连接到只有一个实体管理器的应用程序,即他选择的数据库的实体管理器。数据库中期或任何其他此类内容之间无法切换。

谢谢。

2 个答案:

答案 0 :(得分:6)

此功能称为多租户。

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

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

另见:

答案 1 :(得分:1)

在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;
   }
}