Spring:动态更改EntityManager
出于某种原因,我应该使用的数据库(丑陋!)包含所有表两次;每个表都被复制到以下模式中:Spring:动态更改EntityManager,spring,hibernate,jpa,entitymanager,Spring,Hibernate,Jpa,Entitymanager,出于某种原因,我应该使用的数据库(丑陋!)包含所有表两次;每个表都被复制到以下模式中:DB1\u和DB2\u 这些数据库的结构是相同的 我正在实现的应用程序使用Spring+Hibernate,应该允许用户在运行时更改数据库;这意味着用户可以使用数据库DB1启动应用程序,并在几分钟后切换到DB2,然后返回到DB1,依此类推 我尝试为每个数据库扩展DefaultNamingStrategy: // I have create also DB2 public class DB1 extends De
DB1\u
和DB2\u
这些数据库的结构是相同的
我正在实现的应用程序使用Spring+Hibernate,应该允许用户在运行时更改数据库;这意味着用户可以使用数据库DB1启动应用程序,并在几分钟后切换到DB2,然后返回到DB1,依此类推
我尝试为每个数据库扩展DefaultNamingStrategy
:
// I have create also DB2
public class DB1 extends DefaultNamingStrategy {
private static final long serialVersionUID = 676544180324515651L;
@Override
public String tableName(String tableName) {
return "DB1_" + tableName;
}
}
并通过jpa的属性hibernate.ejb.naming_strategy
设置命名策略,但由于我不明白的原因,我只能更改一次命名策略,接下来的所有调用都会出现异常
有人知道为什么吗
实体管理工厂的配置:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="it.perfectquiz.entity" />
<property name="persistenceProviderClass" value="org.hibernate.jpa.HibernatePersistenceProvider" />
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
</props>
</property>
</bean>
谢谢
“出于某种原因”视为。是的,我知道这是怎样的:-)与其使用一个试图改变个性的EntityManager,为什么不使用两个不同的EntityManager,让应用程序使用其中一个呢?
XmlWebApplicationContext context = (XmlWebApplicationContext) ContextLoader.getCurrentWebApplicationContext();
DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) context.getBeanFactory();
GenericBeanDefinition entityManager = (GenericBeanDefinition) beanFactory.getBeanDefinition("entityManagerFactory");
ManagedProperties jpaProperties = (ManagedProperties) entityManager.getPropertyValues().get("jpaProperties");
TypedStringValue namingStrategy = (TypedStringValue) jpaProperties.get(new TypedStringValue("hibernate.ejb.naming_strategy"));
// only for test!
String newNaming;
if (namingStrategy.getValue().equals(DB1.class.getCanonicalName()))
newNaming = DB2.class.getCanonicalName();
else
newNaming = DB1.class.getCanonicalName();
// only for test!
namingStrategy.setValue(newNaming);
beanFactory.registerBeanDefinition("entityManagerFactory", entityManager);