私が使用しているSpring構成には、entityManagerFactoryBean内のpersistenceUnitPostProcessorの定義が含まれています。
JUnitテストを実行すると(つまり、コンテナーの外部で)ポストプロセッサーが呼び出されますが、デプロイされたWebアプリ(Glassfish 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の比較的初心者なので、明らかな間違いを犯した場合は気楽にやってください。
ありがとうスティーブ