2013-08-01 1 views
0

Spring 응용 프로그램에서 액세스하려는 두 개의 데이터베이스가 있습니다. 두 데이터베이스 모두에 대해 두 개의 SharedEntityManagerBean을 구성했습니다. 내가 해당 데이터베이스의 각 개체에 액세스 Spring에서 관리하지 않는 두 EntityLocatorsMultiple 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> 

다음은 설정입니다. 나는 하나의 SharedEntityManagerBeangetBean() 내의 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)

이 잘 작동 :

그래서 내 현재 해결 방법은 호출하는 것입니다.

답변

0

확인을 분명히 SharedEntityManagerBeanFactoryBean이며, 그것을 위해 나는 SharedEntityManagerBean를 검색 할 빈 이름 앞에 &을 추가해야합니다.

는 또한 나는 아마 호출 할 수

em = context.getBean("entityManager",EntityManager.class);

는 참조 용으로 herehere를 참조하십시오.