由于某种原因,我应该使用的数据库(丑陋!)包含所有表两次;每个表格都复制到这些模式中:DB1_<table>
和DB2_<table>
。
这些数据库的结构是相同的!
我正在实现的应用程序使用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 dinamically 的属性hibernate.ejb.naming_strategy
设置命名策略,但由于我无法理解的原因,我只能更改命名策略一次,以及所有下一步召唤出一个例外。
有人知道为什么吗?
配置 entityManagerFactory :
<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>
我如何尝试更改命名策略:
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);
谢谢,
此致