Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring:动态更改EntityManager_Spring_Hibernate_Jpa_Entitymanager - Fatal编程技术网

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);