我使用的 Spring 配置包含我的 entityManagerFactory bean 中的 persistenceUnitPostProcessor 的定义。
当我运行 JUnit 测试(即在容器外)时,后处理器被调用,但当它作为已部署 Web 应用程序的一部分(在 Glassfish v3 中运行)参与时,后处理器没有被执行。其他一切正常,spring 上下文加载正确,所有定义的 bean 加载,只是后处理器永远不会被触发。
实体扫描器的目的是定位@Entity 注释类。该项目分为两个模块,一个包含域模型,另一个包含 DAO 和持久性代码。
扫描仪代码大致基于此处的博客文章:搜索类路径的自动扫描-jpa-实体。正如我所说,这一切在容器之外都可以正常工作。
显示后处理器 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 的相对新手,所以如果我犯了一个明显的错误,请放轻松!
谢谢史蒂夫