Spring:动态更改EntityManager

时间:2014-04-04 23:17:22

标签: spring hibernate jpa entitymanager

由于某种原因,我应该使用的数据库(丑陋!)包含所有表两次;每个表格都复制到这些模式中: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);

谢谢,

此致

0 个答案:

没有答案