내 Spring
응용 프로그램에서 액세스하려는 두 개의 데이터베이스가 있습니다. 두 데이터베이스 모두에 대해 두 개의 SharedEntityManagerBean
을 구성했습니다. 내가 해당 데이터베이스의 각 개체에 액세스 Spring
에서 관리하지 않는 두 EntityLocators
이Multiple SharedEntityManagerBeans 및 ApplicationContext.getBean 문제
<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()
내의 ApplicationContext에 전화를 정의
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;
}
}
잘 작동 : 그들은 그 같은 모양. 나는 내 application.xml을에 <aop:config proxy-target-class="true"/>
을 추가하여 cglib
프록시를 사용해야합니다 그래서 읽어
Bean named 'x' must be of type [y], but was actually of type [$Proxy]
: 나는 두 SharedEntityManagerBean
의 정의해야하지만 일단 나는 오류가 발생합니다.
그게 최선의 해결책입니까?
해당 행을 추가하면 Caused by: java.lang.NoClassDefFoundError: org/aspectj/util/PartialOrder$PartialComparable
오류가 발생합니다.
aspectj
이 필요합니까?
편집 : 경우
내가 가진 하나의 SharedEntityManagerBean
내가 getBean(SharedEntityManagerBean.class)
를 호출 할 수 있습니다 정의. 이것은 잘 작동합니다.
코드를 디버깅했으며이 호출이 getBean("&entityManager1",SharedEntityManagerBean.class)
(참고 &)이라고합니다.
그러나 getBean("EntityManager1",SharedEntityManagerBean.class)
이름을 전달할 때 형식 캐스트 예외가 발생합니다.
SharedEntityManagerBean
을 정의하고 이름이없는 getBean
을 호출하면 예외가 발생합니다 (해당 이름의 빈을 찾을 수 없음). getBean("&entityManager1",SharedEntityManagerBean.class)
및 getBean("&entityManager2",SharedEntityManagerBean.class)
이 잘 작동 :
그래서 내 현재 해결 방법은 호출하는 것입니다.