我们正在使用spring LocalContainerEntityManageFactoryBean。问题是我们必须在多租户环境中连接不同的数据库。需要找出一种方法,我们可以在运行时更改方言的LocalcontainerEntityMangerFactory bean jpa属性而无需重启
答案 0 :(得分:0)
相反,您应该做的是使用适当的方言初始化两个不同的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。