アプリケーションからアクセスしたいデータベースが 2 つありSpring
ます。SharedEntityManagerBean
両方のデータベースに 2 つ構成しました。構成は次のとおりです。
<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>
対応する各データベースのアクセス エンティティEntityLocators
によって管理されていないものが 2 つあります。Spring
それらは次のようになります。
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;
}
}
applicationContext に1 つしかSharedEntityManagerBean
定義されていない場合、呼び出しは正常にgetBean()
機能します。ただし、両方をSharedEntityManagerBean
定義すると、エラーが発生します。
Bean named 'x' must be of type [y], but was actually of type [$Proxy]
SO を読んで、application.xmlcglib
に追加<aop:config proxy-target-class="true"/>
してプロキシを使用する必要があります。
それが最善の解決策ですか?
その行を追加すると、Caused by: java.lang.NoClassDefFoundError: org/aspectj/util/PartialOrder$PartialComparable
エラーが発生します。
私はそれが必要aspectj
ですか?
編集:
1 つしかSharedEntityManagerBean
定義されていない場合は、 を呼び出すことができますgetBean(SharedEntityManagerBean.class)
。これはうまくいきます。
コードをデバッグしたところ、この呼び出しはgetBean("&entityManager1",SharedEntityManagerBean.class)
(note & ) を呼び出すようです。
ただし、名前を渡すとgetBean("EntityManager1",SharedEntityManagerBean.class)
、型キャスト例外が発生します。
両方をSharedEntityManagerBean
定義しgetBean
、名前なしで呼び出すと、例外が発生します (その名前の Bean が見つかりません)。
getBean("&entityManager1",SharedEntityManagerBean.class)
したがって、私の現在の回避策は、次のように呼び出すことです。getBean("&entityManager2",SharedEntityManagerBean.class)
これはうまくいきます。