Java 在运行时修改SpringLocalContainerEntityManageryBean以更改Hibernate方言

Java 在运行时修改SpringLocalContainerEntityManageryBean以更改Hibernate方言,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我们正在使用spring LocalContainerEntityManageFactoryBean。问题是我们必须在多租户环境中连接不同的数据库。需要找到一种方法,在运行时无需重新启动即可更改方言的LocalcontainerEntityMangerFactory bean jpa属性,而您应该做的是初始化两个不同的LocalContainerEntityManagerFactoryBean实例及其相应的方言,然后根据您的代码应该与哪个数据库交互,简单地引用正确的EntityManager @

我们正在使用spring LocalContainerEntityManageFactoryBean。问题是我们必须在多租户环境中连接不同的数据库。需要找到一种方法,在运行时无需重新启动即可更改方言的LocalcontainerEntityMangerFactory bean jpa属性,而您应该做的是初始化两个不同的
LocalContainerEntityManagerFactoryBean
实例及其相应的方言,然后根据您的代码应该与哪个数据库交互,简单地引用正确的
EntityManager

@PersistenceContext(unitName = "dialect1PersistenceUnit")
private EntityManager entityManager1;

@PersistenceContext(unitName = "dialect2PersistenceUnit")
private EntityManager entityManager2;
如果事情必须是动态的,你有几个选择

如果您打算一次只使用单个数据源,则可以设置数据库,使其基于
AbstractRoutingDataSource
,并设置线程本地值,以确定要使用的持久性上下文。通常,在调用事务管理方面之前,您需要在服务层包装中设置线程本地值

另一种选择是注入
EntityManager工厂
而不是
EntityManager
,并动态构建自己的
EntityManager
,如下所示:

Map props = new HashMap();
props.put( "org.hibernate.dialect", YourDialectClass.class.getName() );

EntityManager entityManager = entityManagerFactory.createEntityManager( props );

HTH.

我不能使用这种方法,因为我们的应用程序指向H2作为默认数据源,我们可以动态配置租户(数据库),可以是oracle、Mysql、MSSQl。在运行时,我们必须确定支持我的答案的方言。谢谢Naros。我们必须采用动态创建entitymanager的方法。其他解决方案不起作用。