4

通常、各バッチジョブが参照する Spring コンテキスト構成を持つ Spring Batch アプリケーションがあります。このように、各バッチ ジョブは同じエンティティ マネージャーを使用します。

バッチ-context.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:batch="http://www.springframework.org/schema/batch"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch-2.1.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">

    <!-- ... -->

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="persistenceUnitName" value="myPersistenceUnit" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
        </property>
        <property name="packagesToScan" value="com.example.domain" />
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
                <prop key="hibernate.cache.use_second_level_cache">true</prop>
                <prop key="hibernate.cache.provider_class"> org.hibernate.cache.EhCacheProvider</prop>
                <prop key="hibernate.max_fetch_depth">3</prop>
                <prop key="hibernate.jdbc.fetch_size">100</prop>
                <prop key="hibernate.jbc.batch_size">1000</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.use_sql_comments">false</prop>
            </props>
        </property>
    </bean>

    <!-- ... -->

</beans>

ここで、特定のバッチ ジョブ コンテキスト (これを ExampleBatch.xml と呼びます) で、別のパッケージを追加して、既に定義されている entityManagerFactory Bean をスキャンしたいと考えています。これは可能ですか?

ExampleBatch.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:batch="http://www.springframework.org/schema/batch"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd
        http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch-2.1.xsd">

    <!-- ... -->    

    <import resource="classpath:batch-context.xml" />

    <bean id="entityManagerFactoryWithExtraPackages"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
        parent="entityManagerFactory">

        <!-- How do I override the packagesToScan property on the already defined entityManagerFactory bean?-->
        <property 
            name="packagesToScan" 
            value ="com.example.domain,com.example.domain.abstraction"
        />
    </bean>

    <!-- ... -->

</beans>

No unique bean of type [javax.persistence.EntityManagerFactory] is defined: expected single bean but found 2「 」と不平を言うので、今の方法ではうまくいきません

「packagesToScan」プロパティをオーバーライドしようとしているのは、このシナリオで適切なアプローチですか? この動作を達成するためのより良い方法はありますか?

編集:

機能を使用して必要なことを達成できましたproperty-override。以下は、私が行った更新された ExampleBatch.xml です。

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:batch="http://www.springframework.org/schema/batch"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
        http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch-2.1.xsd">

    <!-- ... -->    

    <import resource="classpath:batch-context.xml" />

    <context:property-override properties-ref="entityManagerOverride"/>

    <bean id="entityManagerOverride"
        class="org.springframework.beans.factory.config.PropertiesFactoryBean">
        <property name="properties">
            <util:properties>
                <prop key="entityManagerFactory.packagesToScan">com.example.domain,com.example.batch.module.domain</prop>
            </util:properties>
        </property>
    </bean>

    <!-- ... -->

</beans>

これまでのところ、Spring はこれが無効な構成であると怒鳴ることはありません。これが実際に望ましい結果を生み出しているかどうかはまだ判断していません。

編集2:

プロパティ オーバーライド メソッドは十分ではないようです。これは有効な構成ですが、実行時にエンティティ マネージャーを検査すると、次のようになります。

for (EntityType<?> entity : manager.getMetamodel().getEntities()) {
    String name = entity.getName();
    System.out.println(name);
}

com.example.domain パッケージのエンティティのみが含まれています。

他のアイデアはありますか?

4

3 に答える 3

1

現在の方法では、実際には 2 つの別個の Bean を定義していentityManagerFactoryますentityManagerFactoryWithExtraPackages

あなたの要求を解決するには、いくつかの方法があります。

  1. Bean の 1 つを取り除くだけで、定義を 1 つにマージできます。それはあなたにとって選択肢ではないと思います。そうでなければ、あなたは尋ねません。

  2. を抽象として定義するentityManagerFactoryと、とにかく 1 つの Bean になります。

  3. プロパティ オーバーライド メカニズムを使用します。これは、「トップ」Bean を制御できず、そこに定義されている Bean を再構成する (プロパティの値を文字通りオーバーライドする) 必要があるというシナリオに適しています。

于 2013-01-16T20:19:39.297 に答える
0

パッケージ構成に適合する場合は、試してみてください

<property name="packagesToScan" value="com.example.domain.*" />

あなたのbatch-context.xmlで、あなたのExampleBatch.xmlは親を「オーバーライド」する必要がなくなりました。

掘り下げる別の方法は、プレースホルダーを使用することです。batch-context.xml では、次を使用します。

<property name="packagesToScan" value="${packageList}" />

ExampleBatch.xml では、たとえばここで説明されているように、適切な値でプレースホルダーを宣言します: http://www.mkyong.com/spring/spring-propertyplaceholderconfigurer-example/

于 2013-01-16T20:15:31.217 に答える