Spring 多个SharedEntityManagerBeans和ApplicationContext.getBean问题

Spring 多个SharedEntityManagerBeans和ApplicationContext.getBean问题,spring,proxy,applicationcontext,Spring,Proxy,Applicationcontext,我想从我的Spring应用程序访问两个数据库。我为这两个数据库配置了两个SharedEntityManagerBean。以下是配置: <jpa:repositories base-package="xxx" entity-manager-factory-ref="entityManagerFactory1" /> <jpa:repositories base-package="xxx" entity-manager-factory-ref="entityManagerFacto

我想从我的
Spring
应用程序访问两个数据库。我为这两个数据库配置了两个
SharedEntityManagerBean
。以下是配置:

<jpa:repositories base-package="xxx" entity-manager-factory-ref="entityManagerFactory1" />
<jpa:repositories base-package="xxx" entity-manager-factory-ref="entityManagerFactory2" />
<tx:annotation-driven/>

<bean class="org.springframework.orm.jpa.JpaTransactionManager"
        id="transactionManager1">
        <property name="entityManagerFactory" ref="entityManagerFactory1" />
        <property name="dataSource" ref="dataSource1" />
</bean>

<bean class="org.springframework.orm.jpa.JpaTransactionManager"
        id="transactionManager2">
        <property name="entityManagerFactory" ref="entityManagerFactory2" />
        <property name="dataSource" ref="dataSource2" />
</bean>


<bean id="entityManagerFactory1"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
        p:packagesToScan="xxxxxx"
        ....
</bean>

<bean id="entityManagerFactory2"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
        p:packagesToScan="xxxxx"
        ...
</bean>


<bean id="entityManager1" class="org.springframework.orm.jpa.support.SharedEntityManagerBean" >            
        <property name="entityManagerFactory" ref="entityManagerFactory1" />
</bean>

<bean id="entityManager2" class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
        <property name="entityManagerFactory" ref="entityManagerFactory2" />
</bean>


<bean id="dataSource1"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
...
</bean>

<bean id="dataSourceOntology"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
...
</bean>
当我的应用程序上下文中只定义了一个
SharedEntityManagerBean
时,调用
getBean()
就可以了。但是,一旦我同时定义了
SharedEntityManagerBean
s,我就会得到错误:

名为“x”的Bean必须是[y]类型,但实际上是[$Proxy]类型。

我继续阅读,以便通过向application.xml添加
来使用
cglib
代理

这是最好的解决办法吗

当我添加那一行时,我得到了由以下原因引起的
:java.lang.NoClassDefFoundError:org/aspectj/util/PartialOrder$PartialComparable
错误。
我需要
aspectj

编辑:

如果我只定义了一个
SharedEntityManagerBean
,我可以调用
getBean(SharedEntityManagerBean.class)
。这很好。
我调试了代码,这个调用似乎将调用
getBean(&entityManager1,SharedEntityManagerBean.class)
(注意&

但是,当我传递名称
getBean(“EntityManager1”,SharedEntityManagerBean.class)
时,我得到一个类型转换异常

定义了
SharedEntityManagerBean
s并调用
getBean
而没有名称也会导致异常(找不到具有该名称的bean)

因此,我当前的解决方法是调用:
getBean(&entityManager1,SharedEntityManagerBean.class)
getBean(&entityManager2,SharedEntityManagerBean.class)


这个很好用

Ok显然
SharedEntityManagerBean
是一个
FactoryBean
,为此,我必须在bean名称之前添加&,以检索
SharedEntityManagerBean

或者我可以打电话:

em=context.getBean(“entityManager”,entityManager.class)

请参阅和以供参考

public class SpringEntitiyLocator1 {

    private EntityManager em;

    public SpringEntitiyLocator1() {

    }

    private EntityManager getEM() {
        if (em == null) {
            ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(RequestFactoryServlet.getThreadLocalServletContext());
            SharedEntityManagerBean bean =  context.getBean("entityManager1",SharedEntityManagerBean.class);
            em = bean.getObject();
        }
        return em;
    }
}