0

私が使用しているSpring構成には、entityManagerFactoryBean内のpersistenceUnitPostProcessorの定義が含まれています。

JUnitテストを実行すると(つまり、コンテナーの外部で)ポストプロセッサーが呼び出されますが、デプロイされたWebアプリ(Gl​​assfish v3で実行)の一部として参加すると、ポストプロセッサーが実行されません。他のすべてが機能し、Springコンテキストが正しくロードされ、定義されたすべてのBeanがロードされます。これは、ポストプロセッサが起動されないということだけです。

エンティティスキャナーの目的は、@Entity注釈付きクラスを見つけることです。プロジェクトは2つのモジュールに分割されます。1つはドメインモデルを含み、もう1つはDAOと永続性コードを含みます。

スキャナーコードは、クラスパスを検索するauto-scanning-jpa-entitiesのブログ投稿に大まかに基づいています。私が言うように、これはすべてコンテナの外でうまく機能します。

ポストプロセッサBean(簡潔にするためにトリミング)を示す関連するSpring構成要素は次のとおりです。

<bean id="entityScanner" class="com.inno.spring.EntityScanner"> 
    <property name="classPathFilter">
        <value>insurer</value>
    </property>
    <property name="targetPersistenceUnits"> 
        <value>unitTest-hsqldb</value> 
    </property> 
    <property name="classesToExclude"> 
        <value></value> 
    </property> 
</bean>

エンティティマネージャファクトリは次のように定義されています。

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="loadTimeWeaver">
        <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
    </property>
    <property name="dataSource">
        <!-- Workaround to allow custom isolation levels -->
        <bean class="org.springframework.jdbc.datasource.lookup.IsolationLevelDataSourceRouter">
            <property name="defaultTargetDataSource" ref="unitTestDataSource" />
            <property name="targetDataSources">
                <map>
                    <entry key="ISOLATION_READ_UNCOMMITTED">
                        <bean
                            class="org.springframework.jdbc.datasource.IsolationLevelDataSourceAdapter">
                            <property name="targetDataSource" ref="unitTestDataSource" />
                            <property name="isolationLevelName" value="ISOLATION_READ_UNCOMMITTED" />
                        </bean>
                    </entry>
                </map>
            </property>
        </bean>
    </property>
    <property name="persistenceUnitName" value="unitTest-hsqldb" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="database" value="HSQL" />
            <property name="databasePlatform" value="org.hibernate.dialect.HSQLDialect" />
            <property name="showSql" value="${jpa.hibernate.showSql}" />
            <property name="generateDdl" value="${jpa.hibernate.generateDdl}" />
        </bean>
    </property>
    <property name="jpaPropertyMap">
        <map>
            <entry key="hibernate.ejb.interceptor" value="com.inno.jpa.interceptors.InsurerInterceptor" />
        </map>
    </property>
    <property name="persistenceUnitPostProcessors"> 
        <list> 
            <ref bean="entityScanner" /> 
        </list> 
    </property> 

</bean>

私はSpringとJPAの比較的初心者なので、明らかな間違いを犯した場合は気楽にやってください。

ありがとうスティーブ

4

1 に答える 1

0

最終的にこれを機能させることを諦め、代わりにコードを同じプロジェクトに移動しました。永続性.xmlの永続性ユニット定義の下にあるjar-fileオプションは、クラスパスを直接スキャンできるという点で少し柔軟ではないように思えます。

于 2010-08-17T19:49:56.240 に答える