0

アプリケーションからアクセスしたいデータベースが 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)

これはうまくいきます。

4

1 に答える 1

0

どうやらSharedEntityManagerBeanaと そのために、 を取得するために Bean 名の前に&FactoryBeanを追加する必要があります。SharedEntityManagerBean

または、おそらく次のように呼び出すこともできます。

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

ここここを参照してください。

于 2013-08-01T16:01:38.013 に答える