【发布时间】:2016-10-21 18:00:45
【问题描述】:
我们正在使用spring LocalContainerEntityManageFactoryBean 。问题是我们必须在多租户环境中连接不同的数据库。需要找出一种方法,我们可以在运行时更改方言的LocalcontainerEntityMangerFactory bean jpa属性而无需重新启动
【问题讨论】:
我们正在使用spring LocalContainerEntityManageFactoryBean 。问题是我们必须在多租户环境中连接不同的数据库。需要找出一种方法,我们可以在运行时更改方言的LocalcontainerEntityMangerFactory bean jpa属性而无需重新启动
【问题讨论】:
相反,您应该做的是使用其适当的方言初始化两个不同的 LocalContainerEntityManagerFactoryBean 实例,然后根据您的代码应与之交互的数据库简单地引用正确的 EntityManager。
@PersistenceContext(unitName = "dialect1PersistenceUnit")
private EntityManager entityManager1;
@PersistenceContext(unitName = "dialect2PersistenceUnit")
private EntityManager entityManager2;
如果事情必须是真正动态的,你有几个选择。
如果您打算一次只使用一个数据源,您可以设置您的数据库,使其基于AbstractRoutingDataSource,并设置一个线程本地值来确定要使用的持久性上下文。通常,您会在调用事务管理方面之前在服务层包装器中设置线程本地值。
另一种选择是注入EntityManagerFactory 而不是EntityManager 并即时构建自己的EntityManager,如下所示:
Map props = new HashMap();
props.put( "org.hibernate.dialect", YourDialectClass.class.getName() );
EntityManager entityManager = entityManagerFactory.createEntityManager( props );
HTH。
【讨论】: