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