0

我使用的 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 的相对新手,所以如果我犯了一个明显的错误,请放轻松!

谢谢史蒂夫

4

1 回答 1

0

我最终放弃了让它工作的尝试,而是将代码移到了同一个项目中。对我来说似乎有点傻,persistence.xml 中持久性单元定义下的 jar-file 选项在能够直接扫描类路径方面并不灵活。

于 2010-08-17T19:49:56.240 回答